Redis知识点.mm
2020-02-11 12:04:41 0 举报
AI智能生成
Redis知识图谱
作者其他创作
大纲/内容
1.特性及应用场景
特性
单线程
纯内存访问
支持数据持久化
非阻塞IO(epoll)
应用场景
缓存
队列
网站访问统计
分布式Session
应用排行榜
社交关系图
版本新特性
2.8
主从断线重连后采取部分复制(Psync)
Redis Sentinel Stable
3.0
Redis Cluster
3.2
GEO
4.0
提供模块系统方便第三方拓展
非阻塞del和flushall/flushdb功能
RDB和AOF混合持久化模式
Redis Cluster兼容NAT和Docker
5.0
新数据类型Stream(借鉴了Kafka的设计,消息可持久化)
新Redis模块API:Timers and Cluster API
RDB现在存储LFU和LRU信息
集群管理器从Ruby(redis-trib.rb)改成C重写
新sorted set命令:ZPOPMIN/MAX和阻塞变量
主动碎片整理
增强HyperLogLog实现
内存统计报告更直观
Jemalloc升级到5.1版
欢迎关注微信公众号:服务:omsoofw 和订阅:jobdata
2.数据结构及内部编码
基本数据类型
字符串(String)
整型(int)
String
存储的值
可以是字符串、整数或浮点,统称为元素
读写能力
对字符串操作,对整数类型加减
String类型操作
set
设置置顶key的值
set key value
get
获取指定key的值
get key
incr
将key中储存的数字值增一
incr key
decr key
将key中储存的数字值减一
decr key
incrby
key 所储存的值增加给定的减量值(decrement)
incrby key decrement
decrby
key 所储存的值减去给定的减量值(decrement)
decrby key decrement
append
如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
append key value
setnx
只有在 key 不存在时设置 key 的值
setnx key value
mget
获取所有(一个或多个)给定 key 的值。
mget key [key...]
mset
同时设置一个或多个 key-value 对
mget key value [key value ...]
getset
将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
getset key value
setex
将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
setex key seconds value
strlen
返回 key 所储存的字符串值的长度
strlen key
del
删除键
del key
命令(通用的命令)
GET
GET
SET
SET
DEL
DEL
embstr编码的简单动态字符串
简单动态字符串
列表(List)
List类型操作
push
lpush
将一个或多个值插入到列表头部
lpush key value1 [value2....]
rpush
将一个或多个值插入到列表尾部
rpush key value1 [value2....]
pop
lpop
移出并获取列表的第一个元素
lpop key
rpop
移出并获取列表的最后一个元素
rpop key
lrange
获取列表指定范围内的元素
lrange key start stop
llen
获取列表长度
llen key
lindex
通过索引获取列表中的元素
lindex key index
lrem
移除列表元素
lrem key count value
count > 0
从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT
count < 0
从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值
count = 0
移除表中所有与 VALUE 相等的值
lset key index value
通过索引设置列表元素的值
lset key index value
命令
LPUSH
LPUSH
LPUSH list-key 111
RPUSH
RPUSH
RPUSH list-key 222
LPOP
LPOP
LPOP list-key 111
RPOP
RPOP
RPOP list-key 222
LINDEX
LINDEX
LINDEX list-key 0
LRANGE
LRANGE
LRANGE list-key 0 -1
List
存储的值
一个有序序列集合且每个节点都包好了一个元素
读写能力
序列两端推入、或弹出元素、修剪、查改或移除元素
链表(Linkedlist)
快速列表(Quicklist)
哈希(Hash)
哈希表(Hashtable)
压缩表(Ziplist)
Hash
存储的值
有key-valued的散列组,其中key是字符串,value是元素
读写能力
按照key进行增加删除
命令
HSET
在 散 列 里面 关联 起 给定 的 键值 对
HSET
HGET
获取 指定 散 列 键 的 值
HGET
HGETALL
获取 散 列 包含 的 所有 键值 对
HGETALL
HDEL
如果 给定 键 存 在于 散 列 里面, 那么 移 除 这个 键
HDEL
Hash类型操作
hset
将哈希表 key 中的字段 field 的值设为 value
srem key field value
hmset
同时将多个 field-value (域-值)对设置到哈希表 key 中
hmset key field1 value1 [field2 value2]
hsetnx
只有在字段 field 不存在时,设置哈希表字段的值
hsetnx key field value
hget
获取存储在哈希表中指定字段的值
hget key field
hmget
获取所有给定字段的值
hget key field1 [field2]
hgetall
获取在哈希表中指定 key 的所有字段和值
hgetall key
hvals
获取哈希表中所有值
hvals key
hlen
获取哈希表中字段的数量
hlen key
hkeys
获取所有哈希表中的字段
hkeys key
hdel
删除一个或多个哈希表字段
hdel key field1 [field2]
hexitst
查看哈希表 key 中,指定的字段是否存在
hexitst key field
集合(Set)
整型集合(intset)
哈希表(Hashtable)
Set
存储的值
无序的方式,各不相同的元素
读写能力
从集合中插入或删除元素
Set类型操作
sadd
向集合添加一个或多个成员(存在则返回0)
sdd key member1 [member2]
scard
获取集合的成员数
scard key
sinter
返回给定所有集合的交集
sinter key1 [key2]
sismember
判断 member 元素是否是集合 key 的成员
sismember key member
smembers
返回集合中的所有成员
smembers key
srandmember
返回集合中一个或多个随机数
srandmember key [count]
srem
移除集合中一个或多个成员
srem key member1 [member2]
SET( 集合)
包含 字符串 的 无序 收集 器( unordered collection), 并且 被 包含 的 每个 字符串 都是 独一无二、 各不相同 的
命令
SADD
将给 定 元素 添加 到 集合
SMEMBERS
返回 集合 包含 的 所有 元素
SISMEMBER
检查 给定 元素 是否 存在 于 集合 中
有序集合(Zset)
压缩表(Ziplist)
Sort Set
存储能力
带分数的score-value有序集合,其中score为浮点,value为元素
读写能力
集合插入,按照分数范围查找
命令
ZADD
将 一个 带有 给定 分值 的 成员 添加 到有 序 集合 里面
ZADD
ZRANGE
根据 元素 在 有序 排列 中 所处 的 位置, 从 有序 集合 里面 获取 多个 元素
ZRANGEBYSCORE
获取 有序 集合 在给 定 分值 范围内 的 所有 元素
ZRANGE 0 -1 WITHSCORES
ZREM
如果 给定 成员 存在 于 有序 集合, 那么 移 除 这个 成员
ZREM
跳跃表(Skiplist)
其他数据类型
Bitmap
Hyperloglog
GEO
3.持久化
RDB
内存快照
恢复速度快,持久化性能高.但是存在数据丢失风险
AOF
日志文件追加记录
实时持久化,数据安全性更高.持久化效率低
欢迎关注微信公众号:服务:omsoofw 和订阅:jobdata
4.复制
原理
同步RDB文件
复制缓冲区
类型
部分复制(Psync,2.8版本之后)
全量复制(Sync)
拓扑
星型
主 - 从(单节点)
主 - 从(多节点)
树型
主 - 从(主) - 从
欢迎关注微信公众号:服务:omsoofw 和订阅:jobdata
5.高可用
Redis Sentinel
Redis Cluster(集群自带高可用)
Keepalived
6.分布式
方案
集群
Redis Cluster
中间件分片
TwemProxy
CodisProxy
客户端分片
业务程序
原理
客户端分片
一致性哈希算法
Codis
虚拟槽分区(1024个槽)
集群内部数据节点独立运作,无需相互通信
Redis Cluster
Gossip协议 -- 集群数据节点内部相互通信
Raft算法 -- 集群内选主
虚拟槽分区(16384个槽)
7.阻塞
持久化阻塞
Fork子进程
RDB持久化
AOF文件重写
命令阻塞
keys *
smembers
lrange
hgetall
8.内存
内存消耗
对象内存
存储着所有数据
缓冲内存
客户端缓冲
通过参数client-output-buffer-limit控制
复制积压缓冲区
根据repl-backlog-size参数控制
AOF缓冲区
用于在Redis重写AOF文件期间保存最近的写入命令
内存碎片
可采用数据对齐和安全重启等方式规避内存碎片的问题
内存回收策略
惰性删除
定时任务删除
内存优化
缩减键值对象的长度
共享对象池
字符串优化
编码优化(使用ziplist编码能节约内存但会提高耗时-空间换时间)
控制键的数量(如使用hash结构重构字符串结构)
9.客户端
Jedis(Java)
Redis-py(Python)
Redigo(GO)
10.辅助功能
慢查询(slowquery)
管道(pipeline)
11.缓存问题隐患
缓存无底洞
缓存穿透
缓存雪崩
热点key倾斜
热点key重建
12.性能调优
vm.overcommit_memory=1
vm.swapiness=1
关闭THP特性
echo never > /sys/kernel/mm/transparent_hugepage/enabled
调大ulimit
调大TCP Backlog
Redis参数调优
appendfsync
no-appendfsync-on-rewrite
auto-aof-rewrite-percentage
auto-aof-rewrite-min-size
hash-max-ziplist-entries
hash-max-ziplist-value
list-max-ziplist-size
set-max-intset-entries
zset-max-ziplist-entries
zset-max-ziplist-value
hll-sparse-max-bytes
client-output-buffer-limit
13.监控
info
redis-stat
redislive
redis-cli monitor
redis-cli --latency
Codis Dashboard
Zabbix
Grafana
14.Redis与MC
MC、Redis的区别
Redis
1.Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。2.Redis支持数据的备份,即master-slave模式的数据备份。3.Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。4.一般用来做消息队列,存储耗时任务。
MC
1.MC存储热点数据,经常访问的数据2.不可持久化数据,数据都是存在内存,重启后数据丢失3.只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型。
MC、Redis的瓶颈
服务器内存大小
加大服务器内存,使用高配服务器
做MC、Redis集群
1.MC实现集群:http://blog.csdn.net/zljjava/article/details/505108062.Redis分布式锁:http://blog.csdn.net/ugg/article/details/41894947
文件热更新
MC、Redis的可视化工具
Memcached管理与监控工具----MemAdmin
https://my.oschina.net/u/656519/blog/125234
Redis管理与监控工具-----Redis Desktop Manager
http://blog.csdn.net/joyhen/article/details/47358999
MC、Redis的使用场景
实时热数据存储
热数据储存【MC】
微信token获取次数有限,存储在MC中方便读取
频繁读取某个信息,存储在MC中方便读取
充值中心订单数据存储
一卡通微信信息存储
防刷单机制【MC】
充值中心使用MC来存储用户访问接口次数,来防刷单
存储session【MC】
充值中心使用MC来存储session
延时异步任务
守护进程【Redis】
充值中心游戏注入异步处理
充值中心日志入库异步处理
充值中心的补单机制异步处理
信息推送【MQ或Redis】
AUC系统的邮箱发送
短信系统发短信
站内信发送、豆豆发送
阻塞式队列【MQ】
一元夺宝【Redis】
通知开奖
购买时,回调异步
秒杀抢购
MC、Redis的需要注意的点
原子锁--保证操作的唯一性
MC
add函数
Redis
setnx函数
sadd函数=>相当于MC的add函数
内存爆满
MC
不被访问的被新的替换掉
key的储存时间要设定好
redis
启动swap机制,将内容存储在硬盘中,性能下降
key的储存时间要设定好
注意事项:http://www.oschina.net/question/253614_108222
单个key内容大小
MC
单个缓存项不能超过1M
Redis
在Redis中字符串类型的Value最多可以容纳的数据长度是512M
欢迎关注微信公众号:服务:omsoofw 和订阅:jobdata
15.Redis应用
redis构建web网站
登录和cookie缓存
使用redis实现购物车
页面缓存
数据行缓存
网页分析
小结
使用redis构建支持程序
使用redis来记录日志
最新日志
常见日志
计数器和统计数据
将计数器存储到redis
使用redis存储统计数据
简化统计数据的记录与发现
查找IP所属城市以及国家
载入位置表格
查找IP所属城市
服务的发现与配置
使用redis存储配置信息
为每个应用程序组件分别配置一个redis
自动redis连接管理
redis搜索应用程序
使用redis进行搜索
基本搜索原理
对搜索结果进行排序
有序索引
使用有序结合对搜索结果进行排序
使用有序结合实现非数值排序
广告定向
广告服务器
对广告进行索引
执行广告定向操作
从用户行为中学习
职位搜索
逐个查找合适的职位
以搜索方式查找合适的职位
小结
redis构建社交网站
用户和状态
用户信息
状态消息
主页时间线
关注者列表和正在关注列表
状态消息的发布与删除
流API
流API提供的数据
提供数据
对流消息进行过滤
小结
redis构建应用程序组件
自动补全
自动补全最近联系人
通讯录自动补全
分布式锁
锁的重要性
简易锁
使用redis构建锁
细粒度锁
带有超时限制特性的锁
计数信号量
构建基本的计数信号量
公平信号量
刷新信号量
消除竞争条件
任务队列
先进先出队列
延迟任务
消息拉取
单接受者消息的发送与订阅替代品
多接受者消息的发送与订阅替代品
文件分发
地理位置聚合用户数据
发送日志文件
接收日志文件
处理日志文件
小结
欢迎关注微信公众号:服务:omsoofw 和订阅:jobdata
16.redis的lua脚本
不写c代码的情况下添加新功能
将lua脚本载入redis
创建新状态消息
使用lua重写锁和信号量
使用lua实现锁的原因
重写锁实现
使用lua实现计数信号量
移除WATCH/MULTI/EXEC事务
回顾群组自动补全程序
再次对商品买卖市场进行改造
使用Lua对列表进行分片
分片列表的构成
将元素推入分片列表
从分片里面弹出元素
对分片列表执行阻塞弹出操作
小结
欢迎关注微信公众号:服务:omsoofw 和订阅:jobdata
0 条评论
下一页