Redis笔记 ——致敬狂神

学习链接:Bilibili 遇见狂神说
一点知识
redis是NoSQL型数据库,not only sql,也称为非关系型数据库。
默认端口 6379 单线程操作 对3字节的数据读写能达到 读11万次/秒 8万次/秒
总共包含16个数据库,默认在0
nil 是redis中的null
常用命令
select 3 #切换至3号数据库 dbsize #查看当前数据库的 数据量一般为 k-v 的对数 keys * #查看当前库中的所有 key flushdb #清空当前数据库 flushall #清空所有数据库 set name zz #存入一个 name-zz的 k-v数据 get name#将返回这个key对应的值 zz exits name#判断当前key是否存在存在返回1否则返回0 move name 1 #移动 这个k-v 到指定数据库 expire name 10 #设置这个k-v的过期时间为10秒 ttl name #查看这个k-v剩余的有效期时间 type name #查看当前key的类型 append name "hh" #将name对应的value值拼接再次get name时会返回zzhh如果key不存在则等价于set strlen name #查看这个key对应的value值的长度 set views 0 incr views #自增1 下次get views将返回1 decr views #自减1 下次get views将又返回0 incrby views 5 #自增5 下次get views将返回5 decrby views 5 #自减5 下次get views将返回0 getrange name 1 2 #返回name对应value的一部分 从下标1开始到下标2结束即zh getrange name 0 -1 #返回name对应value的一部分 从下标0开始到末尾即zzhh setrange name 1 ab #将name下标1开始的位置 替换为ab返回zabh setex name1 10 "aaa" #如果name1不存在则创建k-v并指定过期时间10秒,具有原子性。 如果存在则覆盖value指定过期时间10秒 setnx name2 bbb #如果不存在这个key则创建成功返回1,如果存在 则创建失败返回0 mset k1 v1 k2 v2 k3 v3 #批量设置这3个k-v对 mget k1 k2 k3 #批量返回相应k值的相应value值 msetnx k1 v1 k4 v4 #批量不存在时设置,具有原子性,如此时k1存在k4不存在,但会全部失败返回0 set user:1 {name:zhangsan,age:10} #保存对象 mset user:1:name zhangsan user:1:ange 10 #也可有上述效果 getset name ccc #先get再set 不存在时 返回nil,但set仍然会生效!等价与创建了一个新的k-v。存在时返回之前的value值且覆盖掉这个value,下次get会返回刚设置的新值#list的操作 lpush list one #往list顶端插入值 lrange list 0 -1 #返回list中所有值 rpush list four #往list底部插入值 lpop list #移除list顶端元素,并返回该元素 rpop list #移除list底部元素,并返回该元素 lindex list 0 #获取list中指定下标为0的值,同上理解就是顶端 llen list #返回list的长度 lrem list 1 value #移除list中指定个数的value值 ltrim list 1 2 #截断list,保留指定下标中的值 rpoplpush list1 haha2 #从list1底部移除一个元素并返回,且将该元素插入list2的顶端 exists list #判断list是否存在存在返回1否则返回0 lset list 0 haha #修改列表指定位置的值, 需要列表和该位置元素已存在,否则报错 linsert list v1 before v0 #往指定列表的指定元素的前面插入指定值 linsert list v1 after v2 #往指定列表的指定元素的后面插入指定值#待续。。。

  • 悲观锁
    所有操作都加锁,假定任何时候都会出问题!会非常影响并发操作下的效率!
  • 乐观锁
    不会对操作加锁,假定任何时候都不会出问题!更新数据的时候,会判断数据的version,在此期间是否被改动过,如果发现被改动过,则此次操作失败!
redis中可以实现乐观锁的效果
使用watch命令 监视一个变量==》 就是使用乐观锁
  • 然后打开 事务执行开关 multi(开始)
  • 。。。一些列操作。。。(入队列)
  • exec 执行。若执行成功,则返回操作后的值 否则返回nil (执行)
    额外的还有一个discard命令 可以取消队列中的某个指令
conf get requirepass #获取制动配置项的值 conf set requirepass "123456" #设置指定配置项的值

redis持久化
  • rdb
    • 按照配置 例如 save 900 1 (900秒修改了一次key)的规则,产生 dump.rdb文件。这个文件由子进程操作io进行持久化。
    • 执行flushall时,会产生dump.rdb文件
    • shutdown时也会产生dump.rdb文件
【Redis笔记 ——致敬狂神】如何恢复rdb文件,执行config get dir获取redis的启动目录,将dump.rdb文件放在这个位置,redis启动时会自动从中读取数据。
  • aof
    • 产生appendonly.aof文件, 是一个无限追加写的文件(就向日志一样记录我们的每一次写操作),可以设置达到多少大小的时候,重新写一个文件
    • appendfsync always
    • appendfsync everysec
    • appendfsync no
redis集群搭建
ps -ef|grep redis#根据进程名查看进程信息 info replication #查看服务器信息

copy配置文件几份,然后修改其中的关键配置
  • 端口号
  • pid
  • log文件名字
  • dump.rdb文件名字
集群 一般为一主二从 然后需要配置从机
slaveof 127.0.0.1:6379

命令方式时临时的(体现为从机断开后再重连,则会恢复为主机)
永久配置 则到配置文件中 制动 replicaon配置
主机只能写,从机只能读
从机重新链接主机时 会执行 全量复制
主机 新写入值时 会执行 增量复制
主机断开时 执行
slaveof no one #自己变成主机

主机重连后不能成为主机了
  • 哨兵模式
    它是redis集群的一个容灾机制,(实际场景一般会有多个哨兵)哨兵将会监控redis集群中的所有主从机实例。当主机宕机时,哨兵检测确认主机宕机,则会对其余的从机发起投票,选举出新的主机维持服务,这个过程时自动的 保证了 redis服务的高可用!
  • 缓存穿透
    当有某条数据查不到时,则会去后台服务查询,而这样的请求短时间内大量触发,就会对服务器造成压力,可能导致宕机!
    解决方案:缓存空对象、布隆过滤器
  • 缓存击穿
    一般发生在热点数据持续高并发访问的场景。我们redis中存储的key一般都会有过期时间,而在这种热点数据过期的一瞬间,仍然高并发的访问则会直接到达后台服务,造成巨大压力,可能宕机!
    解决方案:热点数据不过期、分布式锁
  • 缓存雪崩
    大量数据在同一时间段被访问,同时缓存起来,然后过期时间是一致的,然后过期时间一到,大量数据同时过期,可能导致redis服务宕机!
    解决方案:限流降级、缓存预热

    推荐阅读