开发者社区> 任平生78> 正文

高可用Redis(二):字符串类型

简介: 1.Redis字符串结构 对于Redis来说,所有的key都是字符串,其value可以是string,list,hash,set,zset 比如下面的 键值对的value还可以更加复杂,比如可以是json格式,xml格式,序列化等 字符串类型的value的长度不能大于512MB。
+关注继续查看

1.Redis字符串结构

对于Redis来说,所有的key都是字符串,其value可以是string,list,hash,set,zset

比如下面的

img_7a0a0d01198c2464f765489f812d1ae1.png

键值对的value还可以更加复杂,比如可以是json格式,xml格式,序列化等

字符串类型的value的长度不能大于512MB。

在实际生产中,如果一个值保存成500MB的话,获取这个值的时候会占用很多的网络流量,其次读取的时候也会非常慢,这对于Redis这种单线程应用来说并不明智

在生产环境中,考虑到并发和网络流量的因素,value的大小建议在100KB以内

Redis字符串的使用场景:

缓存
计数器,比如视频网站中视频的播放次数统计等
分布式锁

2.Redis字符串相关命令

2.1 get命令,set命令和del命令

get key             获取key对应的value
set key value       设置key-value
del key             删除key-value

例子:

127.0.0.1:6379> set hello 'world'
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)

注意事项:

get命令,set命令和del命令的时间复杂度都是O(1)

2.2 整型操作命令

incr key        key自增1,如果key不存在,自增后get(key) = 1
decr key        key自减1,如果key不存在,自减后get(key) = -1
incrby key k    key自增k,如果key不存在,自增后get(key) = k
decrby key k    key自减k,如果key不存在,自减后get(key) = -k

例子:

127.0.0.1:6379> get counter
(nil)
127.0.0.1:6379> incr counter
(integer) 1
127.0.0.1:6379> get counter
"1"
127.0.0.1:6379> incrby counter 99
(integer) 100
127.0.0.1:6379> get counter
"100"
127.0.0.1:6379> decr counter
(integer) 99
127.0.0.1:6379> get counter
"99"
127.0.0.1:6379> decrby counter 50
(integer) 49
127.0.0.1:6379> get counter
"49"

注意事项:

incr/decr命令和incrby/decrby命令时间复杂度为O(1)
Redis是天然适合做计数器的
Redis是单线程的,顺序执行,并发执行incr命令不会有竞争的问题,不会计错数

实战

记录网站每个用户的个人主页的访问量,可以使用如下命令

incr userid:pageview(单线程:无竞争)

说明:假如一个用户的id为123,初始pageview为0,别的用户每浏览一次123用户的主页,pageview自增1,这样每个用户id的访问量就进行了区分。

2.3 set命令和setnx命令

set key value           不管key是否存在,都进行设置
setnx key value         key不存在,才进行设置
set key value xx        key存在才设置

例子:

127.0.0.1:6379> exists python
(integer) 1
127.0.0.1:6379> del python
(integer) 1
127.0.0.1:6379> exists python
(integer) 0
127.0.0.1:6379> set python good
OK
127.0.0.1:6379> setnx python good
(integer) 0
127.0.0.1:6379> set python base xx
OK
127.0.0.1:6379> get python
"base"
127.0.0.1:6379> exists python
(integer) 1
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> exists java
(integer) 0
127.0.0.1:6379> setnx java easy
(integer) 1
127.0.0.1:6379> set java aaa xx
OK
127.0.0.1:6379> get java
"aaa"

注意事项:

set命令和setnx命令的时间复杂度为O(1)

2.4 mget命令和mset命令

mget key1 key2 key3                         批量获取key,原子操作
mset key1 value1 key2 value2 key3 value3    批量设置key-value

例子:

127.0.0.1:6379> mset hello world python best php easy
OK
127.0.0.1:6379> mget hello python php
1) "world"
2) "best"
3) "easy"

注意事项:

1.mget命令和mset命令的时间复杂度为O(n)
2.使用get命令获取某个key的值,server端计算后返回对应的值给client端
此时如果想获取n个key的值,需要传输n次,server端也需要计算n次,这样所需要的时间为 n次get = n次网络时间 + n次命令时间
3.如果使用mget命令一次传递n个key的值到server端,只需要传输一次,server端计算之后,一次性把计算结果返回给client端
这样所需要的时间为:1次mget = 1次网络时间 + n次命令时间
4.在很多场景中,使用mget命令的效率比get命令效率高很多,mget命令后接的key越多效率越明显,但是当key的量很多时,可以对key进行拆分,分批获取key的值,

2.5 getset命令,append命令和strlen命令

getset key newvalue     set key newvalue并返回旧的value
append key value        将value追加到旧的value
strlen key              返回字符串的长度(注意中文)

例子:

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> getset hello python
"world"
127.0.0.1:6379> append hello ',java'
(integer) 11
127.0.0.1:6379> get hello
"python,java"
127.0.0.1:6379> strlen(hello)
(error) ERR unknown command 'strlen(hello)'
127.0.0.1:6379> strlen hello
(integer) 11
127.0.0.1:6379> set hello '足球'
OK
127.0.0.1:6379> strlen hello
(integer) 6

注意事项:

getset命令,append命令和strlen命令的时间复杂度为O(1)

2.6 incrby命令,getrange命令和setrange命令

incrbyfloat key float       key自增float值
getrange key start end      获取字符串指定下标所有的值
setrange key index value    设置指定下标所有对应的值

例子:

127.0.0.1:6379> incr counter
(integer) 50
127.0.0.1:6379> del counter
(integer) 1
127.0.0.1:6379> incr counter
(integer) 1
127.0.0.1:6379> incrbyfloat counter 1.1
"2.1"
127.0.0.1:6379> get counter
"2.1"
127.0.0.1:6379> set hello pythonbest
OK
127.0.0.1:6379> getrange hello 0 6
"pythonb"
127.0.0.1:6379> getrange hello 0 5
"python"
127.0.0.1:6379> setrange hello 6 e
(integer) 10
127.0.0.1:6379> get hello
"pythoneest"

注意事项:

incrby命令,getrange命令和setrange命令的时间复杂度为O(1)

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
高可用笔记(3)nginx+tomcat+redis
在《高可用笔记(1)nginx》中已经使用过nginx反向代理tomcat的http服务,本文将介绍如何用nginx+tomcat+redis的组合实现负载均衡。
3497 0
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。 输入描述: 输入数据有多组,每组包含一个字符串s,且保证:1
1871 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
20879 0
面试官刁难:Java字符串可以引用传递吗?(1)
面试官刁难:Java字符串可以引用传递吗?
37 0
+关注
152
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载