Redis基础数据结构

程序员卷不动了 2022-11-17 PM 784℃ 0条
string字符串

字符串是redis中最简单得数据结构;键值对的形势存在;

Redis中字符串是动态字符串,是可以修改的字符串;

内存结构类似Goslice切片,底层是动态数组,采用预分配冗余空间的方式来见少内存的频繁分配,cap一般要高于实际字符串长度len。

当字符串长度小于1M时,扩容都是加倍现有空间,如果超过1M,扩容时,只会多扩1M的空间。字符串最大长度是512M;

键值对操作setgetdelexists

> get test1  // 获取指定key的值,不存在返回nil
(nil)
> set test1 jack // 设置指定key的值
ok
> get test1  // 获取指定值
"jack"
> exists test1  // 判断key是否存在
(integer)1
> del test1 //删除值

批量操作键值对mgetmset

> mget key1 key2 key3 //批量获取指定key值,返回一个列表
"jack"
"rose"
(nil)
> mset key1 value1 key2 value2 // 批量设置
ok

过期expireset扩展命令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"
标签: redis

非特殊说明,本博所有文章均为博主原创。

评论啦~