字符串(String)

字符串是redis中最简单的结构,内部表示为一个字符数组。Redis所有的数据结构都以唯一的Key字符串座位名称,然后通过这个Key取相应的Value值,不同的数据结构差异就在于Value的不一样。
Redis的字符串是动态字符串,是可以修改的字符串,内部的结构采用预分配冗余空间的方式来减小频繁的分配,如当前的字符串分配内存空间要大于实际的字符串长度,当字符串小于1MB时,扩容是加倍现有的空间,当大于1MB时,每次扩容会多扩容1MB的空间。字符串最大的空间为512MB.

基本操作

SET: 将Value的值关联到Key,当这个KEY有其他值的时候,覆盖原内容,无视类型。
如果Key之前有TTL过期时间,重新SET将会抹去TTL

可选参数:

  1. EX second :设置过期时间,单位为s
  2. PX millisecond :设置过期时间,单位为ms
  3. NX:Key值不存在时,才生效(只允许新增)
  4. 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