redis

redis集群数据倾斜

算数据落到哪个槽 用的是crc16

redis
为什么要用Redis?Redis为什么这么快?
几乎覆盖了Memcached的绝大部分功能,升级版。一般作为缓存数据库辅助持久化的数据库
可以持久化,备份恢复。memcached一般不持久化
多线程+锁(Memcached),单线程+io多路复用(redis)
Memcached的value类型只有string。数据向计算移动(全量io存取,反序列化算法)
redis:计算向数据移动(移动数据成本大于移动计算)
io复用:监视select(轮询,最高1024个请求),poll(不限制数量),epoll(标识符)
单线程:worker(6.X io threads)
高版本:IO threads
epoll:多路复用
串行可以保证原子性
6.x之后,默认单线程worker,多线程(io读写)。无论哪个版本,工作线程就一个
连接:nc localhost 6379
redis-cli
dbsize:查看当前库的key数量
keys *
清空:flushdb 清空当前库
flushall 清空所有的16个库,需要恢复

help @string :查看方法

一、5种value类型:

1. string(字符串(strlen是字节长度),数值(incr(+1),decr(秒杀),单线程原子操作,秒杀限流),位图(bitmap,offset溢出会扩容。bitop位操作运算,bitcount(统计登录天数)),

存中文,以 redis-cli --raw 启动
二进制安全(客户端byte数组,只保存不转换)
支持双向索引
统计分析:bitmap布隆过滤器
getrange:[...]
getset:以新换旧,设置新值的同时获得原值

2. list 单键多值,1对n。双向链表,有序可重复。队列.ltrim评论、裁剪数据

lpush,rpush,lpop,rpop
lrange:按照索引下标获取元素(从左到右)。lrange key 0 -1,获取所有元素
lindex,llen(列表长度)
lrem key n value,删除元素(从左到右,n可为正值(从左到右)、负值(从右到左)、0. 为0时,删除所有匹配的值)

3. hash,类似于Map。详情页聚合,聚合(数据来自不同的库)

存储对象
hset key field value:给key集合的field键赋值,hset userInfo user:1010:uid 1010
hmset:批量赋值
hkeys:
hvals:
hgetall:获取所有的key与val
hincrby key field increment :加法。increment为负值,减法
hsetnx:当且仅当不存在时可以成功

4. set集合,无序不可重复。去重无序. 随机事件,抽奖,验证码。成本比较大,串行化执行,延时比较大。独立到一个redis实例

提供了判断一个元素是否在set集合的接口,查找并判断是否秒杀成功
底层是一个value为null的hash表,所以添加、删除、查找的复杂度都是O(1)
sadd
smembers :取出所有值
scard :获取元素个数
srem member [member ...]:删除元素
spop [count]:随机吐出元素。抽奖
srandmember [count]:随机取出元素,不删除

sinter key [key ...]:交集
sunion key [key ...]:并集
sdiff key [key ...]:差集。有顺序,前有后没有

5. ZSET(sorted_set),集合,有序去重。以元素为key,以score为value的map。正向zrange,反向zrevrange

score从低到高排序,score可以重复
push/pop 有序,add/remove 无序
排行榜,翻页,动态翻页
底层:skiplist跳跃表
zadd zSet 100 a 20 b 1 x 500 abc:添加
相同元素不同分数,会更新分数。
相同分数不同元素,正常排序
zrange zSet 0 -1:(索引)查看所有元素
zrangebyscore zSet 100 500:按分数范围查看元素
zscore :查看分数
zrevrangebyscore zSet 150 15:从大到小
zrank zSet x:返回x在集合中的索引

场景

排行榜。缓存,统计bitmap,数值,秒杀,限流,迁出 无状态 把java的数据结构外置 session,栈 队列 数组 hash,聚合数据 详情页,抽奖 随机事件,集合:推荐系统
不推荐用在锁,etcd或zookeeper更好

持久化

持久化后,性能下降
2种方式:快照(rdb,恢复速度快,丢失多,占用大,会丢数据),日志(aof,1.每操作,完整性,强调一致性时适用 2.每秒,至多一个buffer。默认 3.os缓存刷写,一个buffer)
默认开启rdb(缓存,丢数据不怕)

redis 4.0 后新增混合持久化


redis 4.0 后新增混合持久化

1. redis混合持久化的配置

1、appendonly yes

2、aof-use-rdb-preamble yes

原因:混合持久化是依赖aof文件的。当满足条件时aof会进行重写(Rewrite),可以避免aof文件过大的问题。如果aof-use-rdb-preamble yes,重写的时候,aof文件内容格式是[RDB file][AOF tail] 明显特征是aof文件的开头为:REDIS。这个是RDB文件的开头。一般默认重写时机为auto-aof-rewrite-percentage 100 ;auto-aof-rewrite-min-size 64mb。即文件达到64m时进行重写,然后如果文件大小增长了一倍,也会触发重写。

可用性

生产系统中,压力(分片集群,代理集群),单点故障(主从主备)
默认弱一致性,支持强一致性(强一致性破坏可用性)。没有最终一致性

分布式锁

多个redis实例,redlock,抢够过半的锁,没过半的销毁.客户端并发并行抢锁。实现复杂,主动轮询
推荐zookeeper,最终一致性。注册回调,事件机制

主从复制实现读写分离

允许远程访问

redis.conf注释掉bind 127.0.0.1,protected-mode改为no
loglevel四个级别,生产环境使用notice或warning
requirepass设置永久密码

你可能感兴趣的:(redis)