Redis的数据结构
- 字符串(String)(常用)
- 字符串列表(list)
- 有序字符串集合(sorted set)
- 哈希(hash)(常用)
- 字符串集合(set)
Redis是一个key-value的数据库,key定义时候要注意不要过长,最好不要超过1024字节,不仅消耗内存,而且还会降低查找效率;也不要太短,会降低key的可读性;最好有统一命名规范。
String
字符串是redis中最基础的数据结构,在redis中以二进制进行操作的,存入和获取的数据相同;value允许字符串最大长度是512M。
常用命令
- 赋值
设置一个key以及其对应的值,例如设置一个name为myjdemo的数据命令如下:
- 取值
获取一个key对应的值,例如获取name对应的值的命令如下:
- 取值后设置
获取一个key对应的值并给其修改成新的value值,例如我们将name对应的值取出来之后改成myj的命令如下:
该命令会返回myjdemo,再次使用get name
取name的值时,就会返回myj
- 删除一个键
例如删除name这个键的命令如下:
该命令会返回ok,当再次使用get name
取name的值时,就会返回nil,表示为空。
- 数值递增
将key对应的值加一。当数据库中没有该key时,会新建这个key并设置为0,然后incr之后变为1;当数据库中存在该key但他的value是字符串或者其他不可以加一的数据类型时,会报错。例如:
我们数据库中没有num这个key,所以他会新建一个key,对应的value初始值为0,incr后变为1,因此返回1。
还有一个命令incrby,可以将key对应的值加上指定数字。
如果把num在原来基础上3,命令如下:
- 数值递减
同理,当数据库中没有该key时,会新建这个key并设置为0,然后decr之后变为-1;当数据库中存在该key但他的value是字符串或者其他不可以减一的数据类型时,会报错。也有一个对应的decrby
命令,用法一致,不再赘述。
- 拼凑字符串
该命令会在key对应的value后面追加str的字符串,并且返回的时字符串的长度,例如,在num后面追加一个5,命令如下:
此时返回的时2,是指num的长度为2,num当前为45。如果key原来不存在,会自动创建一个空的字符串。
Hash
Hash是一个String Key和String Value的map容器,每一个Hash可以存储4294967295个键值对。
常用命令
- 赋值
1 2
| hset [key] [field1] [value1] hmset [key] [field1] [value1] [field2] [value2] ...
|
其中key为hash的名称,field为键,value为值,hset
命令设置一个field value对,hmset
可以设置多个,但是必须成对出现。
- 取值
1 2 3
| hget [key] [field1] hmget [key] [field1] [field2] ... hgetall [key]
|
相比起赋值,取值多了一个hgetall命令,即一次将该hash中所有键值对全部取出来。
- 删除
1 2
| hdel [key] [field] del [key]
|
hdel
删除指定hash中的指定键值对,del
命令删除整个hash
- 递增/递减
1
| hincrby [key] [field] [number]
|
与之前例子原则相同,不再赘述。
- 扩展命令
1 2 3 4
| hexists [key] [field] hlen [key] hkeys [key] hvalues [key]
|
hexists
用于判断一个hash中是否有某个field,hlen
用于获得该hash中所有键值对的数量,hkeys
用户获取该hash所有键值对的键,hvalues
用于获取该hash中所有的值。
list
在redis中,list是按照插入顺序排序的字符串链表。在插入的键不存在时,会自动创建一个新的链表;链表中的所有元素都被移除时,这个键对应的链表也会移除。如果在链表的两端插入或者删除元素,是非常高效的;如果元素的插入或删除在链表的中间,效率较低。
常用命令
- 两端添加
1 2
| lpush [key] [value1] [value2] ... rpush [key] [value1] [value2] ...
|
lpush
是从左侧向list中添加元素,例如lpush testlist a b c
命令执行后,链表中的元素为cba;rpush
即从右侧向链表中添加元素
- 查看链表
1
| lrange [key] [start] [end]
|
查询key对应的list中第start位到第end位的元素,其中start和end的数值可以为负数,表示倒数第n个元素。例如lrange testlist 0 -1
表示查询第0位到倒数第一位的元素,即查询出testlist中所有的元素。
- 两端弹出
lpop
命令从list中弹出左边第一个元素,弹出时,原list中就没有该元素了;同理rpop
即弹出list中右边第一个元素。
- 获取列表元素个数
- 扩展命令
1 2 3 4 5 6
| lpushx [key] [value] #当[key]对应的list存在时在左边插入value,否则不插入 rpushx [key] [value] #当[key]对应的list存在时在右边插入value,否则不插入 lrem [key] [count] [value] #从[key]对应的list中删除count个value。当count为0时删除所有value,当count大于0时从头开始删除count个value,当count小于0时从后向前删除count的绝对值个value。 lset [key] [index] [value] #将[key]对应的list中下标为index的地方改为value linsert [key] [before/after] [srcvalue] [value] #在[key]对应的list中,将srcvalue的前/后插入value元素 rpoplpush [key1] [key2] ##将[key1]对应的list中右边第一个元素弹出并添加到[key2]所对应的list的左边
|
set
set是没有排序的字符集合,set集合不允许出现重复的元素。
常用命令
- 添加、删除元素
1 2
| sadd [key] [value1] [value2] ... srem [key] [value1] [value2] ...
|
sadd
在[key]对应的set中添加一些元素;srem
在[key]对应的set中删除一些元素。
- 获得集合中的元素
1 2
| smenbers [key] sismenber [key] [value] #判断value是否在set中
|
- 集合中的差集运算
- 集合中的交集运算
- 集合中的并集运算
- 扩展命令
1 2 3 4 5
| scard [key] #得到set的元素个数 srandmember [key] #得到set中随机一个元素 sdiffstore [key] [key1] [key2] #将key1和key2差集存入到key的set中 sinterstore [key] [key1] [key2] #将key1和key2交集存入到key的set中 sunionstore [key] [key1] [key2] #将key1和key2并集存入到key的set中
|
sorted-set
相对于set,它是有序的,每一个元素都有一个分数与之关联,按照分数从小到大排序,分数可以重复但元素不可重复。
常用命令
- 添加元素
1
| zadd [key] [score1] [value1] [score2] [value2] ...
|
如果插入的value已存在,会更新其分数。
- 获得元素
1 2
| zscore [key] [value] #获得value的分数 zcard [key] #获得set的元素个数
|
- 删除元素
1
| zrem [key] [value1] [value2]...
|
- 范围操作
1 2 3 4 5
| zrange [key] [start] [end] zrange [key] [start] [end] withscores #会带着分数显示元素 zrevrange [key] [start] [end] #从大到小取出元素 zremrangebyrank [key] [start] [end] #按元素下标范围删除元素 zremrangebyscore [key] [startscore] [endscore] #按元素分数范围删除元素
|
- 扩展命令
1 2 3
| zrangebyscore [key] [startscore] [endscore] withscores #按元素分数范围获取元素 zincrby [key] [number] [value] #给value加number分 zcount [key] [startscore] [endscore] #统计分数范围内元素的个数
|