1、redis中有5种基本的数据类型
String ,list ,set zset,hash
String使用方法:
Set key value;
Get key
设置一个不存在的字符串,返回0,表示设置失败,已存在,返回1,表示设置新值成功,nx 表示not。
Setnx key value
Get key。
一次性设置多个
mset key1 value1 key2 value2
Hash 哈希
Hset hash key1 value1
Hget hash key1
// 设置一个不存在对的值
Hsetnx hash key1 value1
List 类型
lpush key1 value1 value2 value3
获取某一段数据
lrange list1 0 -1 (0: 第一个,1:最后一个)
在列表后面添加数据
rpush list 1 2
按下标获取数据
lindex list 1
set 集合
sadd 向key对应的set 集合中添加元素
sadd myset a b
获取整个集合的元素
smembers myset
删除集合中的一个数据
strem myset two
spop 随机删除set中的一个元素并返回该元素
spop 随机删除set中的一个元素并返回该元素
Zset 有序集合
向有序集合zset中添加元素并制定顺序,如果元素已存在就更新元素顺序
zadd myset1 1 one
zadd myzet1 2 two
Zrange myset1 0 1
删除一个元素
zrem myzset1 two
1、redis 底层数据存储结构
typedef struct redisObject{
// 类型
Unsigned type:4;
// 编码
Unsigned encoding:4;
// 指向底层数据结构的指针
Void *ptr;
// 引用计数
int refcount;
// 记录最后一次被程序访问的时间
Unsigned lru:22;
}
Redis的底层实现原理是通过encoding的编码方式实现的。
Zset 是怎么保持有序的呢
- 使用ziplist编码方式,ziplist 编码的有序集合对象使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一个一起的压缩节点保存,一个节点保存元素的成员,地儿节点保存元素的分值。并且压缩列表内的元素按分值从小到大的顺序进行排列,小的放在位置靠近表头的位置,大的放置在靠近表尾的位置。
- 使用跳跃表的方式
typedef struct zset{
//跳跃表
zskiplist *zsl;
//字典
dict *dice;} zset;
跳跃表的方式:
跳跃表到大key是score,value 是数值通过key的大小来保持排序。
编码转换
- 保存元素数量小于128
- 保存的所有元素长度都小于64字符
不能满足上面两个条件使用skiplist 编码。保存的所有元素长度都小于64字节。
引用:
Redis:有序集合类型zset的实现原理_一蓑烟雨任平生-CSDN博客
Redis 如何解决hash冲突问题
Redis 使用两个全局hash表,才用rehash 也就是重新hash的方式来解决hash冲突的问题。
Redis执行持久化的方式
RDB 快照方式,AOF 指令执行记录的方式
Redis的高可用方式
1、主从
读写分离: 主从都可以担任读的操作,从节点担任写的操作
故障恢复:当主节点出现问题了,还有其他节点可以使用
负载均衡:Master节点提供写服务,slaver节点读服务分担压力
同步分为三种情况:1、第一次同步2、正常运行期间的同步 3、网络断开时的同步
主从是其他集群的基础。
2、哨兵
加入了哨兵集群对主从进行监控,哨兵之间通过主节点的发布订阅机制进行通信,哨兵通过master节点接受到从节点的列表进行对从节点监控。
3、集群cluster
通过分片来进行管理,集群上每个节点共同承担16384 的 slots
穿透,击穿,雪崩