Redis 核心数据结构 & Redis 6 新特性详

目录

1.list

2.hash 

 3.Set

4.Zset 

 5.GeoHash

 6.面试常见问题

6.1 Client Side Cache 

6.2 ACL权限 


1.list

redis在redisDB中是一个k-V结构,存储在字典dict中,dict包含两个hashTable结构,以数组形式存在,其中list 是一个有序的数据结构,采用双端链表quicklist和ziplist作为底层实现。

[root@localhost ~]# cd /usr/local/redis-6.2.7
[root@localhost redis-6.2.7]# src/redis-server redis.conf
[root@localhost redis-6.2.7]# src/redis-cli
127.0.0.1:6379> lpush a-list a b c
(integer) 3
127.0.0.1:6379> rpush a-list e f g
(integer) 6
127.0.0.1:6379> rpush a-list e 1100 f g
(integer) 10
127.0.0.1:6379> type a-list
list
127.0.0.1:6379> object encoding a-list
"quicklist"

 list的数据结构如下:

2.hash 

 hash在字段比较小时使用ziplist存储,比较大时采用hashtable存储,下图演示object encoding key编码由ziplist变化为hashtable的场景。

127.0.0.1:6379> hset a-hash name caiji age 35 f1 v1 f2 v2 f3 v3
(integer) 5
127.0.0.1:6379> hgetall a-hash
 1) "name"
 2) "caiji"
 3) "age"
 4) "35"
 5) "f1"
 6) "v1"
 7) "f2"
 8) "v2"
 9) "f3"
10) "v3"
127.0.0.1:6379> type a-hash
hash
127.0.0.1:6379> object encoding a-hash
"ziplist"
127.0.0.1:6379> hset a-hash f4 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
(integer) 1
127.0.0.1:6379> hgetall a-hash
 1) "f1"
 2) "v1"
 3) "name"
 4) "caiji"
 5) "f2"
 6) "v2"
 7) "age"
 8) "35"
 9) "f3"
10) "v3"
11) "f4"
12) "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
127.0.0.1:6379> type a-hash
hash
127.0.0.1:6379> object encoding a-hash
"hashtable"

 hash的数据结构如下,可以通过设置redis.conf配置文件配置ziplist和hashtable的存储范围

面试题:string和hash选型和优缺点

 

 3.Set

Set为无序的自动去重的数据类型,当都用整型存储时是有序的,底层使用intset数据结构,当用字符串存储时是无序的,使用hashtable存储。

127.0.0.1:6379> sadd a-set 1 2 3 5 10 9 4 4 4
(integer) 7
127.0.0.1:6379> smembers a-set
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "9"
7) "10"
127.0.0.1:6379> type a-set
set
127.0.0.1:6379> object encoding a-set
"intset"
127.0.0.1:6379> sadd a-set a
(integer) 1
127.0.0.1:6379> smembers a-set
1) "a"
2) "3"
3) "10"
4) "9"
5) "4"
6) "2"
7) "5"
8) "1"
127.0.0.1:6379> type a-set
set
127.0.0.1:6379> object encoding a-set
"hashtable"

intset的数据结构如下,有三个元素。

 

4.Zset 

skiplist原理,使用二半查找,索引方式形成索引树查找数据,第K层索引数=n/2^k。

127.0.0.1:6379> zadd a-zset 100 a 200 b 150 c
(integer) 3
127.0.0.1:6379> zrange a-zset 0 -1 withscores
1) "a"
2) "100"
3) "c"
4) "150"
5) "b"
6) "200"
127.0.0.1:6379> type a-zset
zset
127.0.0.1:6379> object encoding a-zset
"ziplist"

 5.GeoHash

GeoHash是一个算法加上zset实现的

help @geo 

127.0.0.1:6379> help @geo
127.0.0.1:6379> geoadd locations 116.3209103486328 39.92916527606944 guozhuang
(integer) 1
127.0.0.1:6379> geoadd locations 116.391621 39.946583 beijignzhan 116.401969 39.959857 ditangongyuan
(integer) 2
127.0.0.1:6379> geodist locations guozhuang beijignzhan km
"6.3337"
127.0.0.1:6379> geodist locations ditangongyuan beijignzhan km
"1.7200"
127.0.0.1:6379> georadiusbymember locations guozhuang 8 km
1) "guozhuang"
2) "beijignzhan"
3) "ditangongyuan"
127.0.0.1:6379> georadiusbymember locations guozhuang 7 km
1) "guozhuang"
2) "beijignzhan"
127.0.0.1:6379> keys *
1) "locations"
127.0.0.1:6379> type locations
zset
127.0.0.1:6379> object encoding locations
"ziplist"

 geohash底层实现,经纬度编码规则如下。gethash只能发送模糊范围,不会发送具体经纬度,适用于精度不是那么高的场景

 

 

 

 6.面试常见问题

1. redis的多线程模型,在redis.conf中搜索thread-I/O里面有详细注释

redis执行过程:read-解析resp协议-执行命令-写入

多线程默认是关闭的,可以设置redis.conf中io-thread参数,如下图

 配置了io-threads-do-reads参数以后其他I/O线程也可以进行读写任务 

6.1 Client Side Cache 

 本地客户端请求完服务器后会在本地缓存一份数据,当下次数据有修改时同步将客户端缓存失效返回最新数据。redis6.0只支持单机缓存,集群无法缓存。

6.2 ACL权限 

默认客户进来可以做任务事情,flushdb将所有数据清空。

通过设置redis.conf文件中requirepass foobared为requirepass 关键字,可以通过auth 关键字登录

 

 设置权限用户 

查看dangerous危险用户 

 

 

 持久化到配置文件 

 也可以配置ACL权限到单独的配置文件中通过设置redis.conf文件中的aclfile文件路径,移出user aclice on等参数

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bingtanghulu_6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值