string
字符串
字符串是redis中最简单得数据结构;键值对的形势存在;
Redis中字符串是动态字符串,是可以修改的字符串;
内存结构类似
Go
的slice
切片,底层是动态数组,采用预分配冗余空间的方式来见少内存的频繁分配,cap一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有空间,如果超过1M,扩容时,只会多扩1M的空间。字符串最大长度是512M;
键值对操作set
、get
、del
和exists
> get test1 // 获取指定key的值,不存在返回nil
(nil)
> set test1 jack // 设置指定key的值
ok
> get test1 // 获取指定值
"jack"
> exists test1 // 判断key是否存在
(integer)1
> del test1 //删除值
批量操作键值对mget
和mset
> mget key1 key2 key3 //批量获取指定key值,返回一个列表
"jack"
"rose"
(nil)
> mset key1 value1 key2 value2 // 批量设置
ok
过期expire
和set
扩展命令setex
,setnx
> expire test1 5 //5秒后过期
> setex name 5 jack // 5s过期,等价于set+expire
> setnx name jack // 如果不存在就执行set操作,成功返回1,如果存在就创建不成功,返回0
计数incr和decr
字符串中,如果value值是一个整数,还可以对其自增操作,自增是有范围的,最大反为是signed long的最大值和最小值
> set age 10
ok
> incr age // 自增1
(integer) 11
> decr age // 自减1
(integer) 10
> incrby age 10 // 自增步长为10
(integer) 20
> incrby age -10 // 自增负数,为自减10
(integer) 10
> set age 9223372036854775807 # long max
ok
> incr age
(error) ERR increment or decrement would overflow
list
列表
列表是双链表的一种实现,意味着list的插入和删除操作都很快,时间复杂度为O(1),但是索引定位很慢,时间复杂度是O(n)
列表结果常被做异步队列来使用。将需要延后处理的结构体任务序列化成字符串,塞进redis的队列,另一个线程从列表中轮询数据进行处理
> rpush books python java golang
(integer) 3
> llen books
(integer) 3
> lpop books
"python"
> lpop books
"java"
> lpop books
"golang"
> lpop books
nil
- 慢操作
llindex
相当于链表中的get(index int)
方法,它需要对链表进行遍历,性能随着index
参数增大而变差,返回指定下标的元素,元素并未从队列删除
> rpush books java python golang php asp
> llindex books 1 // 类似数组,下标0开始,1就是第二个数
"python"
> llindex books -1 // 负数为倒数第一个元素
"asp"
ltrim
:保留指定区间的元素,区间之外的全部砍掉返回。ltrim start_index end_index
可以通过ltrim实现定长链表
> ltrim books 2 3 // 保留下标为2至3的元素,清空其他的
> ltrim books 0 -1 // 清空队列,下标为0的至最后一个
lrange
:返回指定下标区间的元素,元素并未从队列中删除,如果下标超过,则返回存在的,超出下标的不返回
> lrange books 0 1 // 返回0,1 下标的两个元素
> lrange books 0 -1 // 返回所有,-1数为倒数
set
集合
无序集合,可以用来存储需要排重的数据,可以保证唯一
> sadd book python // 添加元素到无序集合
ok
> sismembers book python // 判断元素是否存在
> srem book python // 删除元素,成功返回1,失败返回0
hash
字典
hash无序字典,底层实现是数组+链表二维结构。第一维是hash的数组位置碰撞,就会将碰撞的元素使用链表串起来
hash结构的存储消耗高于单个字符串
>hset books java "think in java"
(integer) 1
> hset books golang "think in golang"
(integer) 1
> hgetall books # key和value间隔出现
"java"
"think in java"
"golang"
"think in golang"
> hget books java # 获取单个
"think in java"
> hlen books # 长度
(integer) 2
> hmset books php "fuck in php" python "life in python" # 批量设置
ok
> hdel books python # 删除指定hash中指定key值
(integer) 1
> del books # 删除整个key值
(integer) 1
> hincrby books age 1 # 自增
zset
有序集合
有序集合,需要指定集合的score,
可以用来存储粉丝,value值是粉丝的用户id,score是关注时间,可以对粉丝列表按照关注时间来排序
zset还可以用来存储学生的成绩,value值是学生的ID,score是考试成绩,我们可以对成绩分数进行排序
> zadd books 9.0 python # 增加一个score 9.0的value
> zadd books 8.0 php # 增加一个score 8.0的value
> zrange books 0 -1 # 获取全部的value,顺序排列
"php"
"python"