笔记

https://github.com/7117/note/tree/master/Redis

https://blog.csdn.net/m0_46130323/category_9645862.html

https://blog.csdn.net/branwel/article/details/103897256

文章目录

Redis(Remote Dictionary Server)
Redis 运行快速的原因
数据类型
String
单条操作
多条操作
其他命令
Hash
单条操作
多条操作
其他命令
String存储对象(Json) VS Hash存储对象
List
添加
获取
获取并移除
Set
命令
Sorted_Set
命令
Key的操作
命令
数据库操作
命令
持久化
RDB(Relational Database)
保存数据
常用配置项
RDB 持久化优点
RDB应用
RDB持久化缺点
AOF(Append Only File)
保存数据策略
配置
RDB 与 AOF 如何选择
事务
命令
事务中的错误
命令错误
操作错误
锁
命令
数据删除策略
定时删除(即可删除)
惰性删除
定期删除
步骤
数据淘汰策略
配置
检测易失数据集(可能会过期数据server.db[i].expires)
检测全库数据(所有数据集server.db[i].dict)
放弃数据驱逐
服务器基本配置
高级数据类型
Bitmaps
命令
HyperLoglog
命令
GEO
命令
主从复制
创建链接
数据同步
全量复制
部分复制
哨兵模式
配置
集群(cluster)
配置
命令

Redis 运行快速的原因
完全基于内存操作

数据结构简单,数据操作也简单

使用多路I/O复用模型

数据类型
String
单条操作
增:set key value
查:get key
删:del key
多条操作
增:mset key value [key1 value1]
查:mget key [key1]
其他命令
strlen key //获取字符串长度
append key value //有则追加,无则新建
setnx key value //不存在就设置,存在就不设置
incr key //自增 1
incrby key num //给key的值增加num(int 类型),num 正数则为加,num 为负数 则为减
incrbyfloat key num //给key的值增加num(float 类型)
decr key //自减 1
decrby key num //给key的值减num
setex key second value //设置key的值为value存活时间为second秒
psetex key millisecond value //设置key的值为value存活时间为millisecond毫秒
注:
字符串值最大值为512m

Hash
和字符串相似,可理解为字符串厘米套字符串

单条操作
增:hset key field value
查:hget key field
删:hdel key field
多条操作
增:hmset key field value [field1 value2]
查:hmget key field [field1]
其他命令
hgetall key //获取key的全部的值
hlen key //获取key的值的数量
hexists key field //是否存在field
hkeys key //所有key的字段(field)
hvals key //所有key的值
hincrby key field num //给key的field的值增加num (num 为int值)
hincrybyfloat key field num //给key的field的值增加num (num 为float)
hsetnx key field value //存在不设置,不存在设置
注:

Hash类型的value只能存字符串,不允许再嵌套其他类型,如果数据为空为Nil
每个Hash可以存储232−12^{32}-12 
32
 −1个键的值对
Hash类型十分贴近对象的数据存储,并且可以灵活添加、删除对象属性。但Hash类型设计并不是存在量而设计的,切记不可滥用,更不可将Hash作为对象列表使用
hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据时效率会降低,很有可能成为数据访问的瓶颈
String存储对象(Json) VS Hash存储对象
String存在对象讲究整体性,以读为主
Hash存储对象讲究分散性,以写为主
List
讲究顺序

添加
lpush key value [value1] //从左添加
rpush key value [value1] //从右添加
获取
lrange key start stop
lindex key index
llen key
获取并移除
lpop key //从左出
rpop key //从右出
lpush    list    a    b    c
结果:c b a
===============================
rpush list a    b    c
结果:a b c
===============================
list=[a    b    c]
lpop list
结果:b c
===============================
list=[a b c]
rpop list
结果:a b
===============================

注:

list中保存的数据都是String,数据总量是有限的,最多232−12^{32}-12 
32
 −1个元素
list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作(或以栈的形式进行入栈出栈操作)
当stop的值为-1时,获取的是全部数据
list对数据进行分页操作,通常第一页的数据使的信息来自list,其他页面的数据通过数据形式进行加载
Set
命令
增:sadd key member [member1]
查:smembers key
删:srem key member [member1]
获取总量:scard key
判定是否存在:sismember key member
随机获取(原集合保留):srandmember key [count]
随机获取(原集合不保留):spop key
集合交集:sinter key key1 key2
集合并集:sunion key key1 key2
集合差集:sdiff key key1 key2
存储集合交集:sinterstore destination key key1 key2
存储集合并集:sunionstore destination key key1 key2
存储集合差集:sdiffstore destination key key1 key2
集合元素移动:smove source destination member
Sorted_Set
命令
增:zadd key score member [score1 member1]
删:zrem key member [member1]
获取全部(正序):zrange key start stop [withscores]
获取全部(倒序):zrevrange key start stop [withscores]
按条件查(正序):zrangebyscore key min max [withscore limit]
按条件查(倒序):zrevrangebyscore key max min [withscore limit]
按条件删除(索引):zremrangebyrank key start stop
按条件删除(积分):zremrangebyscore key min max
获取集合总量:zcard key | zcount key min max
存储集合交集: zinterstore destination numkeys key key1
存储集合并集:zunionstore destination numkeys key key1
获取索引(正序):zrank key member
获取索引(倒序):zrevrank key member
score值获取:zscore key member
score值修改:zincrby key num member
Key的操作
命令
删除:del key
判断是否存在:exists key
获取key类型:type key
指定有效期:
expire key seconds
pexpire key milliseconds
expireat key timestamp
pexpireat key milliseconds-timestamp
获取有效期:
ttl key
pttl key
设置永久:persist key
查询key:key pattern //*,?,[]
重命名:rename key newkey | renamenx key newkey
对key排序:sort
数据库操作
命令
选择数据库:select index
数据移动:move key db
数据库大小:dbsize
数据清除:
单库删除:flushdb
多库删除:flushall
持久化
RDB(Relational Database)
保存数据
指令(前台):save //阻塞 立即保存
指令(后台):bgsave //不立即执行
配置:save second changes //用bgsave执行操作
常用配置项
数据文件名称:dbfilename dump.rdb //默认
数据保存路径:dir
是否开启压缩:rdbcompression yes //默认
是否开启格式检查:rdbchecksum yes|no //默认no
RDB 持久化优点
RDB是一个紧凑压缩的二进制文件,存储效率高
RDB存储的是Redis在某个时间点的数据快照,非常适用于数据备份全量复制等场景
RDB恢复数据速度比AOF快
RDB应用
服务器中每X小时执行bgsave备份,并将RDB文件拷贝到远程机器中,用于灾难恢复

RDB持久化缺点
RDB方式无论是执行命令还是进行配置,无法做到实时持久化,具有较大可能丢失数据
bgsave每次运行要执行fork操作创建子进程,要牺牲一些性能
Redis的众多版本中未进行RDB文件格式的版本统一,有可能出现各个版本服务器之间数据格式无法兼容
存储数量较大时,效率较低
大数据量下的I/O性能较低
基于fork创建子进程,内存产生额外消耗
宕机带来的数据丢失风险
AOF(Append Only File)
保存数据策略
每次:always
每秒:everysec
系统控制:no

配置
是否开启:appendonly yes|no //默认no
保存策略:appendfsync always|everysec|no
重写:
手动:bgrewriteaof
自动:
auto-aof-rewrite-min-size size
auto-aof-rewrite-percentage percentage
RDB 与 AOF 如何选择
对数据非常敏感,建议使用默认的AOF持久化方案
AOF策略使用everysec,每秒fsync一次,该策略仍可保持很好性能,出现问题最多丢失一秒内的数据
数据呈现阶段有效性,建议使用RDB持久化方案
数据可以做到阶段内无丢失,且恢复较快,阶段点数据恢复通常使用RDB方案

注意:
AOF文件存储体积较大,恢复速度较慢
利用RDB使用线紧凑的数据持久化会使Redis性能降低

综合:

RDB与AOF选择实际上是在一种权衡,每种都有利有弊
如果不能承受分钟内的数据丢失,对业务数据非常敏感,选用AOF
如果能承受分钟内的数据丢失,且追求大数据集的恢复速度选用RDB
灾难恢复选用RDB
双保险策略,同时开启RDB和AOF,重启后Redis优先使用AOF来恢复数据,降低丢失数据量
事务
Redis事务不具有回滚机制

命令
开启:multi
结束:exec
中断:discard
事务中的错误
命令错误
执行事务过程中输入的命令出现错误,Redis会结束事务不再执行,并报出错误的命令

操作错误
执行事务过程中输入的命令正确,其他操作错误,事务中其他命令正常执行,错误操作报错


Redis中锁和事务是相搭配使用的,可解决对key的监控

命令
加锁:watch key [key1]
解锁:unwatch //取消掉所有key的监控

数据删除策略
当key过期后执行数据删除的策略

定时删除(即可删除)
创建一个具有时效性的key时,同时会创建一个定时器来监控该key是否过期,当key过期后立即进行key的删除

优点:节约内存,到时就会进行删除,快速释放占用空间
缺点:CPU压力大影响Redis响应时间和吞吐量
总结:用处理器性能换取存储空间

惰性删除
当一个具有实效性的key过期后不会有删除操作,直到下一次调用时会先检查该key是否过期,如果过期则进行删除操作,并返回nil(该key不存在)

优点:节约CPU性能,发现必须删除的时候才会删除
缺点:内存压力大,出现长期占用内存的数据
总结:用存储空间换取处理器性能

定期删除
Redis会根据设置的参数,定期对具有时效性的key进行清理工作,它是定时删除和惰性删除的结合者,既不像定时删除会立即进行删除给予CPU压力,也不会像惰性删除给予内存压力

步骤
Redis启动服务器初始化时,读取配置server.hz的值(默认为10)
每秒钟执行server.hz次serverCron()服务(serverCron【服务器级别】->databasesCron【数据库级别】->activeExpireCyle【活跃数据级别】)
acitveExpireCyle()对每个expires[*](数据库)逐一进行检测,每次执行250ms/server.hz
对某个expires[*]检测时,随机挑选w个key进行检测
如果key超时,删除key
如果一轮中删除的kye的数量>w*25%,循环该过程
如果一轮中删除的可以的数量<=w25%检查下一个expires[],0-15(所有的数据库)循环
W=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP
参数current_db用于记录activeExpireCyle进入哪个expires[*]执行

数据淘汰策略
当内存到达最大内存限制时进行的数据淘汰策略

数据驱逐淘汰策略配置依据,使用info命令输出相关监控信息,查新缓存hit 命中次数和miss的次数,根据业务调优

配置
最大可用内存:maxmemory //默认为0,一般设置全部内存50%以上
每次选取带删除数据个数:maxmemory-samples //采用随机获取方式
删除策略:maxmemory-policy //达到最大内存后,对被选取带数据进行的删除策略
检测易失数据集(可能会过期数据server.db[i].expires)
volatile-lru:挑选最近最少使用的数据淘汰(最近数据中使用时间离当前最远的数据)。常用
volatile-lfu:挑选最近使用次数最少的数据淘汰(最近数据中使用次数最少的数据)
volatile-ttl:挑选将要过期数据淘汰
volatile-random:任意挑选数据淘汰
ttl:time to live
lru:least recently used
lfu:least frequently used

检测全库数据(所有数据集server.db[i].dict)
allkeys-lru:挑选最近最少使用的数据淘汰
allkeys-lfu:挑选最近使用次数最少的数据淘汰
allkeys-random:任意挑选数据淘汰
放弃数据驱逐
no-enviction //禁止驱逐数据
4.0中默认策略,会引发OOM

服务器基本配置
设置服务器守护进程方式:daemonize yes|no
绑定地址:bing 127.0.0.1
设置服务器端口:port 6379
设置数据库数量:databases 16
设置服务器日志级别:loglevel debug|verbose|notice|warning
日志文件名称:logfile 端口号.log
设置客户端最大连接数:maxclients 0
客户端闲置最大等待时长:timeout 0
高级数据类型
Bitmaps
标记统计

命令
获取:getbit key offset
设置:setbit key offset value // 0 或 1
交、并、或异
bitop op destkey key1 key2
op:
交:and
并:or
非:not
异或:xor
统计指定key中1的数量:bitcount key [start end]
HyperLoglog
基数统计

命令
添加:pfadd key element [element1]
统计:pfcount key [key1]
合并:pfmerge destkey sourcekey [sourcekey1]
GEO
距离计算(只计算水平距离)

命令
添加:geoadd key longitude latitude member [longitude1 latitude1 member1]
获取:geopos key member [member1]
计算距离:geodist key member1 member2 [count]
根据坐标求范围内数据:georadius key longitude latitude radius m|km|ft|mi
根据点求范围内的数据:georadusbymember key member radius m|km|ft|mi
获取指定点对应的hash值:geohash key member [member1]
主从复制
创建链接
方式一:客户端发指令:slaveof masterip masterport
方式二:参数启动:redis-server --slaveof masterip masterport
方式三:服务器配置:slaveof masterip masterport
数据同步
全量复制
从:发送指令(psync2)
主:执行bgsave
主:第一个slave链接时,创建命令缓冲区
主:生成RDB文件,通过socket发送给slave
从:接收RDB文件,清空自己数据,执行RDB文件恢复过程

部分复制
从:发送命令告知RDB恢复完成
主:发送复制缓冲区信息
从:接收信息,执行bgsavewriteaof,恢复数据

哨兵模式
配置
sentinel.conf

启动:redis-sentinel

集群(cluster)
配置
开启:cluster-enabled yes|no
配置文件名称:cluster-config-file filename
节点超时时间:cluster-node-timeout milliseconds
master链接slave最小数:cluster-migration-barrier count
命令
查看节点信息:cluster nodes
从一个节点Redis,切换其主节点:cluster replicate masterip
新增主节点:cluster meet ip:port
忽略一个节点:cluster foeget id
手动故障转移:cluster failover

Redis基础高级学习笔记相关推荐

  1. 【超全必看】Redis基础入门学习笔记(附示例代码)

    Redis简介 许多网站在海量用户访问的高并发情况下出现崩溃问题,根本原因是关系型数据库. 关系型数据库的缺点 性能瓶颈:磁盘IO性能低下 扩展瓶颈:数据关系复杂,扩展性差,不便于大规模集群 解决思路 ...

  2. JAVA基础与高级学习笔记

    JAVA基础与高级学习笔记 /记录java基础与高级,除了较简单的内容,没有必要记录的没有记录外,其余的都记录了/ java初学者看这一篇就够了,全文 6万+ 字. JAVA基础 java会出现内存溢 ...

  3. MySQL高级学习笔记(四)

    文章目录 MySQL高级学习笔记(四) 1. MySql中常用工具 1.1 mysql 1.1.1 连接选项 1.1.2 执行选项 1.2 mysqladmin 1.3 mysqlbinlog 1.4 ...

  4. 微服务基础知识点学习笔记(持续更新)

    微服务基础知识点学习笔记(持续更新) Conrtoller层 整体包括:HTTP协议,JavaWeb三大组件(filter.servlet.listener).SpringMVC(SpringMVC的 ...

  5. K8s基础知识学习笔记及部分源码剖析

    K8s基础知识学习笔记及部分源码剖析 在学习b站黑马k8s视频资料的基础上,查阅了配套基础知识笔记和源码剖析,仅作个人学习和回顾使用. 参考资料: 概念 | Kubernetes 四层.七层负载均衡的 ...

  6. Java基础篇 学习笔记

    List item Java基础篇 学习笔记 java基础篇 第1章 计算机.程序和java概述 学习笔记 1.1什么是计算机 简单来说:计算机就是 ' 存储 ' 和 ' 处理 ' 数据的电子设备. ...

  7. 大数据第二阶段Python基础编程学习笔记(待完善)

    大数据第二阶段Python基础编程学习笔记(待完善) 第一章 Python基础语法 3.8 1-1Python概述 python基础部分: ●Python基础语法: 标识符,关键字,变量,判断循环.. ...

  8. Mysql 高级学习笔记

    Mysql 高级学习笔记 文章目录 Mysql 高级学习笔记 一.Mysql 基础 1. 聚合函数 2. having 3. sql 的执行顺序 4. 约束 5. 试图 二.Mysql 高级 1. M ...

  9. Python基础语法学习笔记

    Python基础语法学习笔记 想淘宝省钱看我简介,博客www.liangxin.name (一) 一.Print()函数 1.数字可以直接输出,无需加引号 只能理解数字,却读不懂文字.因为数字和数学运 ...

最新文章

  1. python在实际中的作用_Python面向对象中__init__的实际作用是什么?
  2. 作业 3 利用分支和循环结构解决问题
  3. 【转】同步与异步复位以及相关的亚稳态状况与设计可靠性
  4. PHP 入门 - 9.安全
  5. 程序员如何跟领导提离职_如何优雅地跟老板提加薪?按照这3个步骤来,也不是什么难事...
  6. mysql datetime month不走索引_like百分号加前面一定不走索引吗?一不小心就翻车,关于mysql索引那些容易错的点...
  7. 强化学习扫盲贴:从Q-learning到DQN
  8. 大学电路题目怎么搜_长沙理工大学2020真题浅析
  9. 爬虫-保存cookie到本地-利用MozillaCookieJar
  10. 讯飞输入法新升级:支持离线输入方式 加强用户数据安全
  11. 计算机专业计算机 等级怎样填,计算机水平一般怎么填
  12. Modbus调试软件使用教程
  13. 磁盘blk_update_request: I/O error
  14. Shader序列帧动画——UnityShader学习笔记复习
  15. 基于单片机指纹考勤系统设计(论文毕设)全套资料
  16. python输入个人所得税计算_分享一下python的个税计算代码
  17. Python进阶强化训练之字符串处理技巧
  18. java面试题_度小满一面_java面经汇总
  19. Promise学习:基础入门
  20. 近8成本科毕业生起薪过万?程序员收入这么高?

热门文章

  1. [微信开发] 微信网页授权Java实现(https://www.cnblogs.com/lovebread/p/5513241.html)
  2. Memcached学习笔记 — 第四部分:Memcached Java 客户端-gwhalin(1)-介绍及使用
  3. 企业定时任务调度器Quartz,定时查询数据库(这里还需要继续做研究)
  4. oracle字符串清洗、拆分案例
  5. 在OpenCV环境下对图像做Gamma校正
  6. C# ASP.NET Forms身份认证
  7. week04_python函数返回值、作用域
  8. 运维常说的 5个9、4个9、3个9 的可靠性,到底是什么???
  9. 驰骋工作流引擎表单设计控件-字段类控件(2)
  10. 301重定向的实现方法