redis笔记

redis (remote dictionary server)
<meta charset="utf-8">http://download.redis.io/releases/

文档

http://redisdoc.com/

expire k1 10 设置过期时间

ttl 查询过期时间

时间到期后 删除 keys * 就没有当前k1了

String 常用命令

set / get / del / append / strlen

incr / decr / incrby / decrby / 一定要是数据才能加减

getrange / setrange

setex(set with expire)键过期秒数 / setnx (set if not exist)

mset / mget / msetnx

getset

列表常用命令

lpush / rpush / lrange

lpop / rpop

lindex,按照索引下标获得元素(从上到下)

llen

lrem key 删N个value

ltrim key 开始index 结束index,截取制定范围的值后再赋给key

rpoplpush 源列表 目的列表

lset key index value 设置指定下标的value

linsert key before / after key 值2

列表 是一个字符串链表, left 和 right都可以插入添加;

如果键不存在,创建新的链表

如果键已存在,新增内容

如果值全部移除,对应的键也消失了

链表的操作无论是头和尾效率都很高,但假如是对中间的元素进行操作,效率就很惨淡了

list
set
hash 就是一个键值对,可以存储对象
zset

redis配置

daemonize:yes:redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表开启守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。

daemonize:no: 当daemonize选项设置成no时,当前界面将进入redis的命令行界面,exit强制退出或者关闭连接工具(putty,xshell等)都会导致redis进程退出。

1.redis 默认支持同时10000个客户端连接 Maxclients

2.redis value 最大 512M Maxmemory

3.Redis内存不足的缓存淘汰策略(maxmemeory-policy)

  • noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键
  • allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键
  • volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键
  • allkeys-random:加入键的时候如果过限,从所有key随机删除
  • volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐
  • volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键
  • volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键
  • allkeys-lfu:从所有键中驱逐使用频率最少的键

redis默认测试,永不过期

4.maxmemeory-samples: 设置样本的数量,默认5个

redis持久化(重要)

介绍:

1.rdb redis database 指定的时间间隔内,将内存中的快照数据Snapshot写入磁盘

2.aof append only file

RDB 详解

rdb 出厂默认策略

1分钟内改了1万次

或5分钟内改了10次

或15分钟内改了1次

save " 代表禁用 RDB策略

在命令中使用save,立马备份当前操作的数据

save命令,马上就持久化,可以针对很重要的数据,set之后 立马执行save命令;

如果不执行save,默认使用.conf里面的备份策略

bgsave也可以里面备份当前操作,与save的区别是 bgsave是异步的,不会发生阻塞;save命令会发生阻塞

save和flushall都会立即将命令同步到rdb文件中

RDB配置

1、stop-writes-on-bgsave-error 当发生持久化错误的时候,redis是否停止接收数据。默认 yes

2、rdbcompression 快照文件是否用 LZF算法压缩,但会消耗CPU。 默认yes

配置异常 用 redis_check_dump 修复

AOF详解

配置文件:

appendonly true打开。默认no,关闭。

appendfilename aof文件名

appendfsync: allways 同步持久化,每次变化都会记录到磁盘,性能差,数据完整性好

everysec 出厂默认设置,异步操作。每秒记录一次,发生宕机,丢失1s数据

no 不同步

配置异常 用 redis_check_aof 修复 用法 : redis-check-aof --fix AOF文件

AOF rewrite

aof文件是追加的形式,所会越来越大。

rewrite aof 文件压缩精简机制

什么时候触发rewrite:默认 是记录上次rewrite之后文件大小的一倍 并且文件大小大于64M后 fork新的线程 触发

No-appendfsync-on-rewrite 重写时是否可以运用Appendfsync,默认 no,保证数据安全性

Auto-aof-rewirte-min-size 设置重写的基准值 默认 64M

Auto-aof-rewrite-percentage 设置重写的基准值(上次重写后大小的百分比)

AOF 关键点:同步策略,文件修复,rewrite

劣势:

1、数据会越来越大,不如rdb

2、恢复的速度也慢

redis事务

MULTI 开始事务

EXEC 提交事务

DISCARD 放弃事务

事务中有一条语句错误,所有的语句都会执行失败(编译时异常);

如果其中的语句是 incr这样的语句,错误了不会提醒,exec后单这条语句不会成功。所以redis对事务的支持并非是绝对的。

WATCH 监控:

悲观锁:对事情的发展很悲观,为了不出事,自动加锁

乐观锁:在每条记录后面加上version

redis发布与订阅

消息中间件

进程间的通信模式 pub发送者发送消息,sub 订阅者接收

订阅 subscribe c1 c2 c3 同时订阅 c1 c2 c3 三个频道的发布

publish c1 hello-redis -- 向c1频道发送消息 hello-redis

psubscribe news* 订阅 带有通配符的 频道

redis主从复制

1、配从不配主

2、从库配置 slaveof 主库IP 主库端口

1、命令 info replication 查看主从复制状态

2、成为从机那一刻,将会复制主机所有的数据

3、从库不能set值,只能get值 只读模式

4、主机挂了,重启之后,从机自动连接主机

5、从机挂了,重启之后 变成 master,不会从主机获取数据;如果需要连接主机,可以在配置文件中配置主机地址IP端口

6、主从复制原理:首次成为slave,全量同步;后面进行增量同步

7、主机down了之后,从机6380可以执行 slaveof no one,不再跟从任何主机。另外一台从机 slave of ip 6380 重新确认主机 --- 反客为主

主从三种方式:

一主多从 6379 ---》 6380、6381

薪火相传 6379 ---》 6380 ---》6381

反客为主 主机挂掉之后,其中一台从机 slaveof no one,其他从机 slaveof 新的slaveof no one的机器

如果主机挂了,不可能手动指定新的master;要使用哨兵模式

在redis 目录下 配置sentinel.conf,内容为:

sentinel monitor host6379 127.0.0.1 6379 1 代表 其他从机投票数多,就被选为主机

79挂掉之后,重新回来 会变成从机

redis主从复制原理:

从数据库连接主数据库,发送SYNC命令;

主数据库接收到SYNC命令后,可以执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;

主数据库BGSAVE执行完后,向所有从数据库发送快照文件,并在发送期间继续记录被执行的写命令;

从数据库收到快照文件后丢弃所有旧数据,载入收到的快照;

主数据库快照发送完毕后开始向从数据库发送缓冲区中的写命令;

从数据库完成对快照的载入,开始接受命令请求,并执行来自主数据库缓冲区的写命令;(从数据库初始化完成)

主数据库每执行一个写命令就会向从数据库发送相同的写命令,从数据库接收并执行收到的写命令(从数据库初始化完成后的操作)

出现断开重连后,2.8之后的版本会将断线期间的命令传给从数据库,增量复制。

主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave在任何时候都可以发起全量同步。Redis的策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步

redis哨兵模式工作模式:

https://www.jianshu.com/p/06ab9daf921d

问题:

数据穿透?

实现队列?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Redis是单线程的,基于内存操作的,CPU不是Redis的性能瓶颈,机器的内存和网络带宽才是。数据结构类型:字符...
    _不想翻身的咸鱼阅读 3,173评论 0 0
  • redis简介 Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的...
    有缘再见阅读 3,012评论 0 0
  • redis是什么: Redis is an open source, BSD licensed, advanced...
    凯睿看世界阅读 3,114评论 0 0
  • 五种数据类型介绍 常用的类型主要是 String、List、Hash、Set、ZSet 这5种。 注意:set方法...
    firefly_阅读 1,859评论 0 1
  • 前言 在大型应用场景中,常常使用nignx做负载均衡以分摊请求压力,随之而来的是session的存储成为难题,即服...
    霜漠冰河阅读 2,405评论 0 0