redis字段使用http://redisdoc.com/index
五种数据类型:String、 list、 hash、 set、 sorted set(有序集合)
String:
redis支持哪几种数据结构:字符串,整数,浮点,INCR
在redis内部,string的数据结构int/sds
key的命名:体现namespace
使用场景:
list:双向链表 lpush,rpush
redis3.2之前linkedlist和ziplist
redis3.2之后quicklist双向链表,每个节点是ziplist(由ziplist组成的双向链表)
使用场景:1、消息队列(生产者lpush, 消费者brpop);2栈(后进先出 lpush lpop)
3、队列(先进先出 (lpush rpop))
hash类型
hash有两种结构hash、ziplist(数据量小的时候)
hset userinfo age 18
hset userinfo name zhansan
hget....
哈希冲突时rehash:将dict[0]的数据迁移到dict[1]内
使用场景:
集合类型(set),不允许重复,无序
sadd bbs "bbs.gupao.com" "csdn.com"
smember bbs
数据结构 intset(整数)、hashtable(key, value(null)只使用key)
(sortedset)有序集合:
zrange
zrerange
数据结构 ziplist或者 skiplist+ hashtable
使用场景:
keys * :查看所有的key,生产环境慎用
ttl key :查看key的过期时间还剩多少
过期时间(超时时间)设置
expire key seconds
setex(String key, int seconds, String value)
消极方法(passive way),当引用访问key时发现key已经失效,会将key删除
积极方法(active way),周期性去已设置过期时间的key中选择一部分(随时测试)的key进行删除
1、随机测试20个带有timeout信息的key
2、如果超过25%的key被删除,会重复随机测试
redis持久化
RDB:快照的模式,当符合条件的时候,redis会fork子进程(比较耗性能),通过子进程将数据进程写入临时文件,等到持久化过程结束以后,会生成dump.rdb快照文件(如果文件存在会覆盖)
条件: 1、配置规则(save seconds changes):在seconds秒内有changes个以上key被更改过
save 900 1
save 30 1 0
save 60 1 0000
以上三个满足一个就能触发持久化
2、save命令 (会阻塞所有客户端的请求)或者
bgsave(不会阻塞,后台异步处理持久化)
3、flushall清楚所有内存数据,只要配置了配置规则,就会执行快照
4、执行复制操作(主从复制操作)
RDB,的缺点:上一次快照执行结束和下一次执行开始的空档期数据会丢失
AOF:默认是关闭的,(appendonly yes)类似一个日志的概念
保证数据最少的丢失,
性能会比RDB低,因为每次事务操作,会写入磁盘里面文件(appendonly.aof)
appendfsync everysec 默认每秒同步一次到磁盘文件内(从系统缓存)
可以同时配置两种方式(rdb和aof)
如果aof 和rdb都开启了会优先使用aof的方式
redis内存回收策略
LRU
物理内存是1G,如果物理内存不够的话,操作系统会从磁盘分配一个虚拟内存
内存回收策略:
maxmemory-policy noeviction
allkeys-lru 最少使用的数据去淘汰
allkeys-random 随机淘汰数据
volatile-random(随机的) (已设置过期时间)
volatile-lru(使用最少的) (已设置过期时间)
volatile-ttl(即将过期的) (已设置过期时间)
redis单线程为什么性能很高
(多线程很好的利用了多核心cpu,redis的瓶颈不在cpu利用率上)reids的主要瓶颈是内存和网络
redis key不要设置的过长,会影响网络传输,从而影响性能
redis性能高是由于使用了多路复用
同步阻塞,同步非阻塞,异步阻塞,异步非阻塞
redis使用lua脚本实现原子性(可以解决秒杀超卖问题,也可以用消息队列)
redis集群
数据同步(数据一致性)
选主
主从配置(slaveof ip port)
主:配置文件中bind参数指定那些服务器可以访问,注释掉
从:配置文件设置 slaveof ip port(主服务器ip+主服务器port),
info replication 查看redis服务器状态
master_link_status:up 表示已连接上主redis
原理:全量复制(初始化),增量复制,无磁盘复制
从服务监听主服务命令:replconf listening-port 6379
无磁盘复制(repl-diskless-sync-delay 5)不生成磁盘快照
选主:(哨兵机制)master选举
1、监控master和salve是否正常运行
2、当master出现故障的时候,从slave中选举一个新的master
sentinel(哨兵,支持集群)监控集群(哨兵也有个内部选举机制,队长 raft算法,多个哨兵同时监控redis集群)(leader选举过程,过半节点反馈同意选举节点为leader,在指定时间内倒计时,时间结束后选举自己,同时向其他节点发送心跳)
+sdown master 主管认为master挂了
+odown master 客观认为master挂了
+new-epoch 1创建一个选举
+vote-for-leader 投票leader
+elected-leader选举leader
failover-end
redis 分片
一致性hash -> codis(中间件工具,迁移,动态扩容和缩容,支持多cpu)
reids集群
gossip协议的无中心化节点的集群
集群模式下,为什么会有MOVED的error?
./redis-cli -c -p 7000
->Redirected to slot.... 会重定向
redis的java客户端
jedis、redisson、lettuce
redis实现分布式锁,setnx 设置过期时间防止死锁
网友评论