Redis将数据以键值对的形式存储在内存之中,key均为String类型,value的类型各有差异。
Redis中的字符串是直接以二进制数据的方式存储的,单位是字节,redis只认识字节不认识字符,不做任何的编码转化,存的是啥,取出来就是啥,不仅可以存储文本文件(整数、字符串、json、xml等)还可以存储二进制文件(图片、音频、视频等),Redis对String类型的数据大小限制为512MB。一般来说,redis的乱码问题会比较少。
String相关命令预览:
命令 | 执行效果 | 时间复杂度 |
---|---|---|
set key value | 设置键的值是value | O(1) |
get key | 获取key的值 | O(1) |
del key | 删除指定的key | O(1) |
mset k1 v1 k2 v2 ... | 批量设置指定的键值 | O(k),k为键个数 |
mget k1 k2 ... | 批量获取指定key的值 | O(k),k为键个数 |
incr key | 将指定key的值加1 | O(1) |
decr key | 将指定key的值减1 | O(1) |
incrby key n | 将指定key的值增加n | O(1) |
decrby key n | 将指定key的值减少n | O(1) |
incrbyfloat key n | 将指定key的值增加浮点数n | O(1) |
append key value | 追加value到指定key的值末尾 | O(1) |
strlen key | 获取指定key的值的长度 | O(1) |
setrange key offset value | 覆盖指定key从偏移量开始的部分值 | O(1) 或 O(N),取决于字符串长度 |
getrange key start end | 获取指定key的从起始到结束的部分值 | O(1) 或 O(N),取决于字符串长度 |
set & get :
当我们进入redi客户端输入set时,系统自动给提示:
系统提示我们set后面要填写两个参数key和value,和两个可选参数。
[EX seconds|PX milliseconds|KEEPTTL]:(中间使用的时“|”符号代表或者的意思)
- EX seconds:设置过期时间,单位是秒s;
- PX milliseconds:设置过期时间,单位是毫秒ms;
- KEEPTTL:当新增的key已经存在时,使用这个参数,新的value会覆盖旧的value,同时保持旧value的过期时间在新value上不变;
[NX|XX]:(同理也是或者的意思)
- NX:只在 key 不存在时才进行设置,即如果 key 之前已经存在,设置不执行;
- XX:只在 key 存在时才进进行设置,即如果 key 之前不存在,设置不执行;
注意:由于带选项的 SET 命令可以被 SETNX 、 SETEX 、 PSETEX 等命令代替,所以之后的版本中,Redis命令可能进行合并。注意不存在SETXX命令
get key //获取对应key的value值,仅支持获取String数据类型的value值,其他类型使用get会报错
FLUSHALL:
删除redis上所有的键值对(谨慎使用),可选参数 ASYNC
"ASYNC" 是一个缩写,表示在异步操作中执行某个任务。在计算机编程领域,异步操作指的是在后台执行任务,而不会阻塞主线程或程序的执行。相反,程序可以继续执行其他任务,而不需要等待异步操作完成。
在 Redis 中,"ASYNC" 通常用于表示在执行某个命令或操作时,使用异步方式进行处理。这意味着 Redis 将在后台执行命令,而不会阻塞其他操作或客户端的请求。
例如,在 Redis 中,执行 FLUSHALL 命令可以用于清空所有数据库中的数据。如果使用 "ASYNC" 参数,即执行 FLUSHALL ASYNC 命令,Redis 将以异步方式执行清空操作,而不会阻塞其他命令的执行或客户端的响应。
使用异步方式执行操作的好处是,它可以提高系统的响应性能和并发处理能力。它允许程序在执行耗时的操作时继续处理其他任务,从而提高系统的整体效率和吞吐量。
mset & mget:
一次行设置或者获取多个键值对数据。如果一次操作太多的键值对可能回导致redis阻塞。
setex & psetex:
设置键值对的同时添加过期时间,setex单位时秒s,psetex过期时间时毫秒ms;
incr & incrby & decr & decrby & incrbyflout:
- incr key :自增命令,key的编码方式为int,如果key不存在则会创建新的key,value为1。
- incrby key n:value值加n,也可以加负数,同样要求value实际编码为int,否则会报错。数值范围也不能超过64/8字节为可以表达的整数范围。
- decr key:自减
- decrby key n:value减n,也可以减去正数。
- incrbyflout key n:value增加n,n可以是双精度浮点数,没有与之对应的减浮点数命令,可以使用加上一个负数。
append:
追加value到指定key的值末尾,如果key对应的值不是String的话会报错,如果key不存在则会创建一个新的key,值为value参数。
append key value
strlen:
strlen key
获取到字符串长度,单位是字节。xshell终端默认是utf8编码,在utf8字符集中一个汉字是3个字节,所以下图最终的输出结果是9个字节,如果终端是unicode编码,unicode字符集中一个汉字是两个字节,那么下图输出的结果就应该是6个字节了。
xshll小技巧:ctrl+s 是冻结当前画面,防止屏幕滚动过快影响阅读;ctrl+q 解除冻结;
C++中字符串的长度以字节为单位。
Java中字符串的长度以字符为单位,一个字符是两个字节。
上图中,设置了name为中文,get name 得到的二进制编码,这就是文章开头所讲的,redis以二进制形式存储数据,以字节为单位,并不会进行编码转化,存的是啥,取出来的还是啥,设置name时存储的是中文的二进制编码,取出来的自然也是二进制编码,又因为不同的编码方式汉字的字节数不同,所以redis无法直接显示中文。想让显示中文,可以在启动redis的时候添加 --raw 选项。让redis客户端自动尝试翻译二进制数据。
getrange:
getrange key start end // 获取区间内的子串,这里的区间是闭区间
redis中的区间指的都是闭区间,而计算机领域途中,大多数区间指的都是左闭右开区间。redis下标从0开始且支持负数,这一点和python一样。-1就是倒数第一个元素,0是第一个元素。需要注意的是如果是汉字进行剪切得到的就可能不是完整的汉字了,原因很简单,原本三个一组或者两个一组的字节被打乱了,redis客户端翻译的时候就出错了。C++中有一样的问题,Java中相当于String帮我们把这个问题处理了一下。
setrange:
setrange key offset value // offet是偏移量、value是用于替换的字符串,返回值为替换后字符串的长度。
如果新字符串过长会自动在旧字符串上追加,如果该位置没有字符,则是自动补为“\x00”(会被算在字符串长度之中),但是以redis-cli启动redis客户端显示“\x00\x00cccc”,以--raw形式启动redis则显示“cccc”,如下图:
和中文剪切一样,替换的时候也可能会导致中文二进制字节码顺序错位,翻译后中文显示不完整。