redis是开源BSD许可高级的key-value存储系统(NoSQL)
可以用来存储字符串,哈希结构,链表,集合,因此,常用来提供数据结构服务
redis和memcached相比的独特之处:
1、redis可以用来做存储(storage),而memcached是用来做缓存(cache)
这个特点主要因为其有持久化功能
2、redis中存储的数据有多种结构,而memcached存储的数据只有一种类型“字符串”
redis 从海量数据查询某一个固定前缀的key要注意
少量的话用命令,get keys pattern 例如 keys zhang*
海量的数据用 scan sursor [MATCH pattern] [COUNT count] 这个返回来的游标可能会重复所以记得把key去重
redis 设置分布式锁
setnx key value 如果设置成功,返回1,设置失败,返回0
解决setnx锁长期有效的问题
setnx key value [EX seconds] [PX milliseconds] [NX|XX] 如果设置成功返回OK,否则返回nil
用redis的list作为队列,rpush生产消息,lpop消费消息
缺点,没有等待队列有值就去消费,导致读不到数据,
弥补,可以通过应用层引入sleep机制去调用lpop重新
也可以用blpop key [key ....] timeout 阻塞直到队列有消息或者超时
缺点,只能一个链接的消费者消费。
RDB持久化,保存某个时间点的全量数据快照
1.手动触发RDB
save命令:阻塞redis的服务器进程,知道rdb文件被创建
bgsave命令:fork出一个进程来创建rdb文件,不阻塞服务器进程
2,自动触发RDB
根据redis.conf配置里的save m n定时触发(用的是bgsave)
主从复制时,主节点自动触发
执行debug reload
执行shutdown且没有开启aof持久化
AOF(Append-only-file)持久化:保存写状态
记录下除了查询之外的所有变更数据库的状态的指令
以append的形式追加保存到AOF文件中(增量)
redis的集群原理
一致性哈希算法:对2的32次方取模,将哈希值空间组织成虚拟的圆环,然后在根据 redis服务器的各种参数(比如ip地址,名称)使hash计算出哈希值,映射到圆环上的位置。然后查询的key使用相同的函数hash计算出哈希值,顺时针查找第一个节点为要使用的redis服务器。
如果发生宕机就会跳过宕机机器查找下个机器节点,如果新增机器节点道理一样
hash环的数据倾斜问题,这时候一致性hash引入虚拟节点,来分担数据分配不均匀的问题