导图社区 redis
这是一篇关于redis的思维导图,介绍了redis的作用、redis的常用数据结构、redis的持久化、redis是单位线程的为什么那么快。
社区模板帮助中心,点此进入>>
英语词性
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
法理
刑法总则
【华政插班生】文学常识-先秦
【华政插班生】文学常识-秦汉
文学常识:魏晋南北朝
【华政插班生】文学常识-隋唐五代
【华政插班生】文学常识-两宋
redis
作用
缓存
数据存在内存中
常用数据结构
string
没有用'/0'结尾
实用len记录字符串长度
提升查询速度
redis内部为当前字符串分配的空间capacity一般要高于实际的字符串长度len
字符串小于1MB的时候
扩容最多扩容1MB
预分配
最长512MB
命令
set key value
get key
expire key 10
mset key1 1 key2 2 key3 3
mget key1 key2 key3
如果value是一个整数,可以进行自增操作
incr age
list
底层数据结构类似于JAVA linkedList
双向链表
插入、删除
o(1)
查询
o(n)
常用来异步队列来使用
当列表弹出最后一个,自动被删除,被内存回收
rpush language JAVA C++
右边进
llen language
统计长度
lpop language
左边出
lindex lang 2
相当于list.get(index)
trim lang strat end
保留区间内的元素
hash
底层数据结构类似于hashMap
数组+链表
值是字符串
渐进式的rehash策略
查询同时查两个hash
后续定时以及操作命令中,循序渐进迁移到新的hash
全部迁移之后,新的hash代替旧的hash
hash移除最后一个元素
内存回收
hset test language "C C++ JAVA"
塞值
hgetall test
获取
hget test
hlen test
长度
hmset test1 1 test2 2
批量塞值
set
相当于java的hashset
键值对无序 & 唯一
字典的所有value都是null
最后一个被移除之后,回收
具有去重功能
sadd lang java
smembers lang
获取集合的全部值
scard lang
获取key集合的长度
spop key
弹出第一个元素
zset
类似于java中的sortedSet、hashMap结合体
value唯一
value 会有一个 score,代表排序权重
内部实现跳跃表
最后一个元素移除之后,内存会被回收
zadd books 9.0 "thank in java"
zrange books start end
获取范围内的取值
zrevrange books start end
倒序获取范围内的取值
zscore key "value"
获取value的排序分数
zcard books
books的长度
zrank key "value"
value的排名
zrem key "value"
删除value
持久化
rdb-redis dataBase
将redis内存中的数据定时dump到磁盘上
fork一个子线程
写入临时文件
二进制存储压缩-占用空间小
与aof相比可以更快的重启
优缺点
优点
速度快
存储的是二进制文件,方便传输
缺点
无法保证数据安全-有数据丢失
持久化配置
6379.conf
save 900 1
在900s之后有一个key发生变化,dump内存快照
手动触发
save
redis主线程处于阻塞状态,直到持久化完成
bgsave
只有在fork()子线程的时候会短暂的阻塞
禁用持久化
config set save ""
配置文件重要参数说明
rdb持久化
rdbcompression
yes
开启文件压缩
lzf算法压缩文件
需要更多的空间存储
rdbchecksum
在写入或者读取文件时,检查rdb文件检查
发现文件有损坏,停止启动
aof-append on file
redis的操作记录以日志追加的方式写进日志
以日志追加的形式,打开可以看到详细的操作记录
更安全-数据很少丢失
相比rdb更慢
存储的是一个文本文件
后期文本过大,传输困难
appendfsync always
每次有数据修改都会写入aof文件
appendfsync everysec
每秒钟同步一次,aof的缺省策略
appendfsync no
高效-但数据不会被持久化
官方建议同时开启
redis4.0之后引入混合持久化方式
写入的时候,先把当前数据以rdb形式写入文件开头,后续操作以aof形式保存
保证了redis重启时候的速度
数据安全性也高
redis是单线程的为什么那么快
纯内存操作
非阻塞io的多路复用
多个tcp连接公用一个线程,不用为每一个连接都创建一个线程
避免了多线程问题带来的性能消耗
上下文切换
共享资源竞争