Redis之String
1 String
String是Redis里面最简单的一种数据结构。
在Reids中,所有的key都是字符串(序列化之后是字符串)
不同的key对应的value则具备不同的数据结构,对于常说的五种不同的数据类型,主要是指value的数据类型不同。
Redis中的字符串是动态字符串,内部是key修改的,像java中的StringBuffer,它采用分配冗余空间的方式来减少内存的频繁分配。
在Reids内存结构中,一般实际分配的内存会大于需要的内存,当字符串小于1M的时候,扩容都是在现有的空间基础上加倍,扩容每次扩1M空间,最大,最大512M。
1.1 set
//给一个k赋值
set k3 99
1.2 append
使用append命令时,如果key已经存在,则直接在存在的字符串后面追加值,否则就创建新的键值对
//存进键值对k1
append k1 java
//查看k1的值
get k1
//会在上面k1的基础上追加字符串
append k1 .org
1.3 get
get用来获取一个key的value
- getset
获取并更新字符串
//获取k3的值并把其更新为100
getset k3 100
1.4 decr
可以实现对value的减1操作(前提是value是一个数字,如果不是数据会报错,如果value不存在,则会给一个默认的值为0,在默认值的基础上减1)
//则会得到-1
decr k2
- decrby
和decr类似,但是可以自己设置步长相减,该命令第二个参数是步长
decrby k3 5
1.5 incr
给名为k3的key设置value自增
incr k3
- incrby
给某个key的value自增,同时可以设置步长
incrby k3 9
- incrbyfloat
和incrby类似,但是自增的步长可以设置为浮点数
incrbyfloat k3 0.5
1.6 mget和mset
批量获取和批量存取
mget k1 k2 k3
mset k4 4 k5 5 k6 s
1.7 ttl
查看key的有效期(-1表示永远不会过期,-2表示过期)
ttl k7
1.8 setex
给key设置value的同时,还设置过期时间。(k7后面的第一个为过期时间)(时间单位是秒),第二个是要存储的值
setex k7 3 j
1.9 psetex
和setex类似,只不过这里的时间单位是毫秒
psetex k7 10000 java
1.10 setnx(分布式锁的关键)
默认情况下,set命令会覆盖已经存在的key,setnx不会(0表示没有被修改,存在不会修改,不存在会创建)
setnx k3 js
- msetnx
批量设置(0表示设置失败,有一个存在都会设置失败)
msetnx k3 3 k6 6
1.11 getrange
可以用来返回key对应的value的子串,这有点类似于java里面的substring,这个命令第二个和第三个参数就是截取的起始和终止位置
获取从第四位到最后(-1表示最后一个字符串,-2表示到倒数第二个字符串·····)
getrange k1 4 -1
1.12 setrange
覆盖一个已经存在的value(3为从第几个开始)(如果设置的值超出本身字符串的值,中间的值会用0补齐)
setrange k3 3 123
设置前:“python”
设置后:“pyt123”
1.13 strlen
查看字符串长度
strlen k3
1.14 bit命令(操作位图)
在redis中,字符串都是以2进制的方式来存取的。
例如set k1 a
,a对应的ASCII码是97,97转为二进制是01100001;
BIT相关的命令就是对二进制进行操作的。
1.14.1 getbit
key对应的value在offset处的bit值
127.0.0.1:6379> set k1 a
OK
127.0.0.1:6379> get k1
"a"
127.0.0.1:6379> getbit k1 0
(integer) 0
127.0.0.1:6379> getbit k1 1
(integer) 1
127.0.0.1:6379> getbit k1 2
(integer) 1
127.0.0.1:6379> getbit k1 3
(integer) 0
127.0.0.1:6379> getbit k1 4
(integer) 0
127.0.0.1:6379> getbit k1 5
(integer) 0
127.0.0.1:6379> getbit k1 6
(integer) 0
127.0.0.1:6379> getbit k1 7
(integer) 1
1.14.2 setbit
修改key对应的value在offset处的bit值
b对应的ASCII码是98,98转为二进制是01100010
127.0.0.1:6379> setbit k1 6 1
(integer) 0
127.0.0.1:6379> setbit k1 7 0
(integer) 1
127.0.0.1:6379> get k1
"b"
1.14.3 bitcount
统计二进制中1的个数(0到3指的是字符串的计算长度,不是二进制的计算长度)
127.0.0.1:6379> bitcount k1 0 3
(integer) 3