Skip to content

14 redis学习笔记

Jinxin Chen edited this page Dec 25, 2019 · 3 revisions

Nosql

解决了什么问题?

redis的value最大支持512M,但是请不要将内存当硬盘用

优点: × 易于扩展 × 大数据量时高性能 × 灵活的数据模型(字段随意)

3v(海量,多样,实时)+3高(高性能,高并发,高扩展)

mongodb:分布式文件系统

ACID

CAP:强一致性,可用性,分区容错性:3选2

BASE:基本可用,软状态,最终一致

分布式:不同的服务器部署不同的模块;集群:不同的服务器部署相同的模块

redis

remote directory server

/usr/local/bin

查看进程是否有启动:

ps -ef | grep redis

redis特性

  • 单进程,epoll,提高大并发连接少量活跃的CPU利用率
  • 默认16个数据库
  • select:选库
  • dbsize:key的数量
  • flushdb:清空当前库
  • flushall:情况所有库

key

keys *: 查看所有key exists key:查看key是否存在 select:选库 move:移动key到不同的库 expire key:设置key的过期时间 ttl key:查看key的过期时间 type key;查看key的类型

incr/decr/incrby/decrby:对数字加减,原子操作 getrange/setrange:获取或设置substring,getrange xx 0 -1表示获取所有 setex:设置值的同时设置过期时间 setnx:不存在才设置值 mset/mget/msetnx:批量设置key,注意,msetnx多个key的时候,只要有一个key存在,就会都报错

list

lpush/rpush:左插,右插 lpop/rpop:右出,左出 lindex/rindex:按照位置查数据 llen:获取长度 lrem:删除n个value ltrim:从指定位置截取指定长度的值,并赋值给原list rpoplpush list1 list2;右出左进,从一个list到另一个list lset list1 index value:从左边设置指定位置的值 linsert list1 before/after value valueToInsert:在指定值的左边插入值

set

sset/smembers/sismembers:设置,获取,判断 scard:获取集合里的元素个数 srem:删除集合中的元素 srandmember key n:随机返回集合的n个元素值 spop:随机取值并删除 smove set1 set2 value1:将集合的元素移动到另一个集合 sdiff/sinter/suniom set1 set2:差集,交集,并集,注意,sdiff是在set1的集合中取,比如[1,2], [2,3]的sdiff返回1,没有3

hash

hset/hget hmset/hmget/hgetall hdel:删除某个属性 hlen:属性个数 hexists:判断属性是否存在 hkeys/hvalues:获取所有属性,获取所有值 hincrby/hincrbyfloat:把某个属性值增加 n hsetnx:不存在才赋值

zset

zadd zset01 score1 v1 score1 v2: zrange zset01 0 -1 [withscores]:获取所有zset01的值,[包含分数] zrangebyscore zset 60 (90 limit index count:获取60到90分之间但不包含90的值,从index开始返回count个 zrem zset01 v1:删除v1 zcard/zcount 60 90 zrank:获取排名 zscore:获取某人的分数 zrevrank:获取倒数排名 zrevrange:倒数排名 zrevrangebyscore 90 60:注意这个分数要倒过来

<<<<<<< HEAD:14-redis学习笔记.md 47

redis.conf

# 获取redis当前启动路径
config get dir
# 设置认证
config set requirepass "123456"

# 设置缓存过期策略
maxmemory-policy
# 样本数,对于非精确算法,先选出这些样本然后再比对
maxmemory-simples

redis的持久化,19

  • rdb:内存快照,复制新进程写入文件dump.rdb
    • 配置:save [time] [changes]
    • save/bgsave命令手动备份
  • aof:以日志的形式记录每个写操作,追加记录到文件中
    • Appendfsync
      • Always:同步持久化,每次数据发生变更立即同步到磁盘
      • Everysec:默认值,每秒同步,可能会丢失1秒内的数据
      • No:交给操作系统来完成

aof文件会优于rdb文件先加载,当aof文件损坏时,redis会无法启动,此时可以用reds-check-aof --fix来修复aof文件的错误

当aof文件是上一次rewirte的一倍大小时,且大小超过64M时,启动rewrite,优化aof文件大小

auto-aof-rewrite-percentage: 100 auto-aof-rewrite-min-size: 64mb

实务

  • multi
  • exec
  • discard
  • watch
  • unwatch

注意,在执行实务时,有两种情况:

  1. 命令错误,在加入命令队列的时候就会报错,并且执行的时候,全部命令都失败
  2. 运行时错误,在加入命令队列的时候没报错,执行的时候,只有该命令失败,其他命令正常执行
  • 悲观锁:怕不一致,所以加锁
  • 乐观锁:没人同时改,不加锁,但更新之前判断数据有无更改(通过版本号),适用于读多写少

发布订阅

# 列举当前所有的channel
pubsub channels

# 查看某些channel的订阅数量
pubsub numsub [channel-name]

复制(master/slaver)

读写分离

slaveof ip port

注意:

  1. 主机挂了,从机的身份不会改变,但是仍然可读;主机恢复后可继续保持原有主从状态
  2. 从机挂了,再启动的时候,需要重新运行slaveof命令,才可以恢复从机的身份

变为master: slaveof no one

哨兵模式(sentinel)

自动选择master

redis-sentinel xx.conf

缺点:

  • 复制延迟
  • 主从太多时,会加重负担

76a8d71a9ffa162b9c723dc5b8e59fef4e4f772c:web-tech/14-redis学习笔记.md

Clone this wiki locally