字符串(String)
字符串是redis中最简单的结构,内部表示为一个字符数组。Redis所有的数据结构都以唯一的Key字符串座位名称,然后通过这个Key取相应的Value值,不同的数据结构差异就在于Value的不一样。
Redis的字符串是动态字符串,是可以修改的字符串,内部的结构采用预分配冗余空间的方式来减小频繁的分配,如当前的字符串分配内存空间要大于实际的字符串长度,当字符串小于1MB时,扩容是加倍现有的空间,当大于1MB时,每次扩容会多扩容1MB的空间。字符串最大的空间为512MB.
基本操作
SET: 将Value的值关联到Key,当这个KEY有其他值的时候,覆盖原内容,无视类型。
如果Key之前有TTL过期时间,重新SET将会抹去TTL
可选参数:
- EX second :设置过期时间,单位为s
- PX millisecond :设置过期时间,单位为ms
- NX:Key值不存在时,才生效(只允许新增)
- XX :Key值存在是,才生效(只允许修改)
127.0.0.1:6379> set name Job # 设置key-va;ue
OK
127.0.0.1:6379> set name Job NX # 使用NX参数,不存在才可以设置
(nil) # 失败,表示name已经存在
127.0.0.1:6379> get name # 获取name
"Job"
127.0.0.1:6379> set name Bob XX # 使用XX参数,存在才可以设置
OK
127.0.0.1:6379> set age 18 XX # age不存在,则失败
(nil)
127.0.0.1:6379> get name
"Bob"
127.0.0.1:6379> set age 18 EX 20 # 设置过期时间,TTL ,20S过期
OK
127.0.0.1:6379> ttl age # 查看过期时间
(integer) 17
127.0.0.1:6379> ttl age
(integer) 16
127.0.0.1:6379> get age # 获取Value
"18"
127.0.0.1:6379> get age # 再次获取,Value没有了
(nil)
127.0.0.1:6379> del name # 删除key为name 的数据
(integer) 1
EXISTS: 判断一个key是否存在,返回0表示不存在,返回1表示存在
APPEND: 如果Key存在且Value是一个字符串,则在Value后面拼接上
127.0.0.1:6379> set name David # 插入数据
OK
127.0.0.1:6379> append name 1 # 追加
(integer) 6
127.0.0.1:6379> get name # 取值
"David1"
127.0.0.1:6379> exists name # 判断是否存在
(integer) 1 # 存在
127.0.0.1:6379> del name # 删除
(integer) 1
127.0.0.1:6379> exists name # 不存在
(integer) 0
DECR : 将对应key的Value 减一,如果不存在,则默认从0开始减
DECRBY:将对应key的Value 减掉xx,如果不存在,则默认从0开始减
INCR : 将对应key的Value 加一,如果不存在,则默认从0开始减
INCRBY:将对应key的Value 加上xx,如果不存在,则默认从0开始减
127.0.0.1:6379> set count 100
OK
127.0.0.1:6379> decr count
(integer) 99
127.0.0.1:6379> decrby count 20
(integer) 79
GETRANGE : 通过字符串的 start 和 end 两个偏移量截取返回的范
围
GETSET key value:将给定 key 的值设为 value ,并返回 key 的旧值(old value)
SETRANGE key offset value :修改偏移量范围内的值,范围是offset后面的值
127.0.0.1:6379> set name Ronaldo # 设置
OK
127.0.0.1:6379> get name
"Ronaldo"
127.0.0.1:6379> getrange name 1 -1 # 从1开始获取,到结束
"onaldo"
127.0.0.1:6379> setrange name 1 Ma # 从第一位开始,改变string的值
(integer) 7
127.0.0.1:6379> get name
"RMaaldo"
Bitmap(位图)
redis中位图的使用方式,大致场景在bool类型的数据存储上,位图实质上就是一个bytes数组,我们可以利用操作string的方式对他进行操作,也可以使用getbit/setbit进行bit级别的操作。
通过操作bit控制整个字符串
he 的 bytes为0110100001100101
127.0.0.1:6379> setbit s 1 1
(integer) 0
127.0.0.1:6379> setbit s 2 1
(integer) 0
127.0.0.1:6379> setbit s 4 1
(integer) 0
127.0.0.1:6379> setbit s 9 1
(integer) 0
127.0.0.1:6379> setbit s 10 1
(integer) 0
127.0.0.1:6379> setbit s 13 1
(integer) 0
127.0.0.1:6379> setbit s 15 1
(integer) 0
127.0.0.1:6379> get s
"he"
通过操作字符串控制bit
he 的 bytes为0110100001100101
127.0.0.1:6379> set s he
OK
127.0.0.1:6379> getbit s 1
(integer) 1
127.0.0.1:6379> getbit s 2
(integer) 1
127.0.0.1:6379> getbit s 4
(integer) 1
127.0.0.1:6379> getbit s 9
(integer) 1
统计
bitcount
统计bitmap中的1的个数
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> bitcount hello 0 0 # 统计第1个字符中1的个数
(integer) 6
127.0.0.1:6379> bitcount hello 0 2 # 统计第1、2个字符中1的个数
(integer) 16
bitpos
统计对应范围内第一个bit出现的位置
bitmap s bit start offset
127.0.0.1:6379> bitpos hello 1 1 2 # hello中1 从第2为开始到第三位结束第一次出现的位置
(integer) 9
bitfield
管道指令,可以同时使用多个get\set\incrby