共计 2515 个字符,预计需要花费 7 分钟才能阅读完成。
自动写代码机器人,免费开通
这篇文章给大家分享的是有关 Redis 基本数据结构是什么的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考。一起跟随丸趣 TV 小编过来看看吧。
Redis 基础数据结构
Redis 有 5 种基本数据结构:String(字符串)、list(列表)、set(集合)、hash(哈希)、zset(有序集合)
字符串 string
字符串类型是 Redis 的 value 最简单的数据结构,类似与 Java 语言中的 ArrayList(数字列表),不过在 Redis 里 String 是一种动态字符串
Redis 里的 String 采用预分配冗余空间的方法
[图片上传失败 …(image-724c60-1537973556456)]
set get
set keyname test
get keyname
//key 如果存在就返回 0
setnx keyname test
exists keyname
del keyname
// 批量设置
mset key1 test1 key2 test2
// 批量获取
mget key1 key2
1) test1
2) test2
key 过期
// 设置 5s 后过期
expire keyname 5
//setex 是 expire 和 set 的复合写法
setex keyname 5 test
//5s 后查询
get keyname
NULL
计数
ps:value 为数字的情况,可以使用 incr 和 incrby 计数
set num 10
//incr 默认加 1
incr num
//incrby 后面要加上数字
incrby num
ERR wrong number of arguments for incrby command
// 正确计数
incrby num 5
16
列表 list
下面介绍一下 redis 的另外一种数据结构 list
前面我们说 redis 里的 string 类似与 java 语言里面的 ArrayList,则 redis 里的列表就类似与 LinkList(链表),链表一个特别就是更新和新增特别快,查询索引慢。
为什么说类似与 linklist? 因为 redis 的 list 并非和 linklist 一样,它其实是一种快速列表 (quicklist) 的形式,列表结构如图:
[图片上传失败 …(image-625c1b-1537973556457)]
这里要介绍一下压缩列表 (ziplist) 了, 压缩列表是什么?其实就是连续的内存空间
从图可以看出快速列表其实就是由压缩列表和双向的指针组成,不过我们知道链表是两个指针的,也就是 prev 和 next 执行,这就是快速列表和 linklist 的一个不同点了。
PS:然后 redis 设计时,为什么改成双向指针?假如和链表一样,用两个指针 prev、next,同样可以实现遍历,不过双向指针有一个很明显的优点,就是占用的内存空间就相对少了。
队列和栈
/* 队列:First in first out */
// 加两个 value
rpush keynames key1 key2
llen keynames
lpop keynames
lpop keynames
//rpush 会自动过期的
rpop keynames
/* 栈:First in last out */
// 同样,加两个元素
rpush keynames key1 key2
rpop keynames
rpop keynames
key1
字典 hash
Redis 的字典类似与 java 语言的 hashmap,也是无序的二维结构,也即数组加列表的结构。这是 redis 字典和 hashmap 类似的地。
然后也有不同,比如 rehash,刷新字典操作,hashmap 是全部热 hash,当字典足够多时,性能不是很好的,所以 redis 进行改造,采用渐进式的方式,为什么说是渐进式?因为 redis 不会全部 reload,而是保存新旧两个字典,然后采用定时任务,将旧 hash 的数据搬到新的 hash,搬后在回收 hash 内存空间
字典 (hash) 的数组加链接结构:
[图片上传失败 …(image-f5660f-1537973556457)]
hset keynames key1 test1
hset keynames key2 test2
// 批量 set
hmset keynames key1 test1 key2 test2
// 获取 key1 的值
hget keynames key1
test1
// 获取 hash 为 keynames 的长度
hlen keynames
// 获取全部
hgetall keynames
1) key1
2) test1
3) key2
4) test2
集合 set
redis 的 set 和 java 语言中的 hashset 类型,是一种无序唯一的。
sadd keynames key1
//key1 已经加过了,所以返回 1
sadd keynames key1 key2
smembers keynames
1) key2
2) key1
// 查询某个 key 是否存在,相当与 contains
sismember keynames key1
// 相当于 count
scard keynames
// 随意弹出 key1
spop keynames
key1
有序集合 zSet
有序集合是 redis 里比较有特色的,它类似于 SortedSet 和 HashMap 的组合。其内部实现是一种被称作跳跃列表的数据结构。有序集合一方面它就是一个 set,所以每个元素都是唯一的,然后它可以给每个 value 赋值一个 score,再根据这个 score 进行排序,score 就相当于一个权限排序的标识。
ps:因为这个原因,有序集合可以被用来存储粉丝信息,value 值是粉丝 id,score 是关注时间
//9.0 是 score 也就是权重
zadd keyname 9.0 math
zadd keyname 9.2 history
zrange keyname 0 -1
1) history
2) math
zrevrange keyname 0 -1
1) math
2) history
// 相当于 count()
zcard keyname
获取指定 key 的 score
zscore keyname math
9
跳跃列表 TODO
感谢各位的阅读!关于 Redis 基本数据结构是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!
向 AI 问一下细节
丸趣 TV 网 – 提供最优质的资源集合!