redis学习

2018年09月17日

文档

官网:https://redis.io/

中文翻译文档:https://piaosanlang.gitbooks.io/redis/content/

命令详解:https://redis.readthedocs.io/en/2.4/

redis 基本数据类型

  • String:字符串,是Redis最基本的数据类型,一个键最大能存储512MB
  • List:列表,最多可存储 2^32 - 1 元素 (4294967295, 每个列表可存储40多亿)
  • Set:集合, 是string类型的无序集合,集合中最大的成员数为 2^32 - 1(4294967295, 每个集合可存储40多亿个成员)。
  • ZSet:有序集合,集合中最大的成员数为 2^32 - 1
  • Hash:哈希表,每个 hash 可以存储 2^32 - 1 键值对

redis 命令详解:http://redis.cn/commands.html

redis 实现分布式锁:https://wudashan.cn/2017/10/23/Redis-Distributed-Lock-Implement/

String 字符串操作

setnx 是”SET if Not eXists”的简写。

设置过期时间 setex key seconds value, 例如 setex name 5 xiaomo.mo (name 5s 后过期)

  • set 设置一个key
  • get 查询一个key
  • del 删除一个key
  • exists 查询一个key是否存在
  • setrange key offset value, 字符串覆盖
  • setrange ­­ 覆盖key对应的string的一部分,从指定的offset处开始,覆盖value的长度。
  • mset ­­ 一次设置多个key的值,
  • mget ­­ 一次获取多个key的值
  • msetnx 对应给定的keys到他们相应的values上。只要有一个key已经存在,MSETNX一个操作都不会执行。(MSETNX是原子的)
  • getset ­­ 设置key的值,并返回key的旧值
  • getrange key start end ­­ 获取指定key的value值的子字符串
  • incr ­­ 对key的值加1操作
  • incrby ­­ 同incr类似,加指定值 ,key不存在时候会设置key,并认为原来的value是 0
  • decr ­­ 对key的值做的是减减操作,decr一个不存在key,则设置key为­1
  • decrby ­­ 同decr,减指定值
  • append ­­ 给指定key的字符串值追加value,返回新字符串值的长度。

Hash 操作

  • HSET key field value 设置key里一个域的值
  • hget key field 查询一个field的值
  • HSETNX key field value ­­ 只在 key 指定的哈希集中不存在指定的字段时,设置字段的值
  • hmset key field value [field value …] ­­ 同时设置hash的多个field
  • hmget ­­ 获取全部指定的hash filed
  • hincrby ­­ 指定的hash filed 加上给定值
  • hexists ­­ 测试指定field是否存在
  • hdel 从 key 指定的哈希集中移除指定的域
  • hkeys 获取key对应的所有域
  • hvals ­­ 返回hash的所有value
  • hgetall ­­ 获取某个hash中全部的filed及value
  • hstrlen 返回 hash指定field的value的字符串长度

List 操作

  • RPUSH key value [value …] 放入List
  • LPOP key 移除并且返回 key 对应的 list 的第一个元素
  • LTRIM key start stop 修剪(trim)一个已存在的 list,这样 list 就会只包含指定范围的指定元素(例如: LTRIM foobar 0 2 将会对存储在 foobar 的列表进行修剪,只保留列表里的前3个元素)。
  • lrange 读取指定范围数据

Set 操作

  • SADD key member [member …] 添加一个或多个指定的member元素到集合的 key中
  • SCARD key 返回集合存储的key的基数 (集合元素的数量).
  • SDIFF key [key …] 返回一个集合与给定集合的差集的元素.
  • smembers key 读取所有成员
  • SINTER key [key …] 求交集

ZSet 操作

  • ZADD key score member 将所有指定成员添加到键为key有序集合(sorted set)里面
  • ZCOUNT key min max 返回有序集key中,score值在min和max之间(默认包括score值等于min或max)的成员
  • ZINCRBY key increment member 为有序集key的成员member的score值加上增量increment
  • zrevrange 逆序排序

如果score超过17位,则redis会变为科学计数法,可能丢失精度.

ZSet使用

    // 放入,zadd key [NX|XX] [CH] [INCR] score member [score member ...]
    zadd mysortset 0 redis 2 mongodb
    // 读取
    ZRANGEBYSCORE mysortset 0 1000

Redis 订阅发布模式

  • SUBSCRIBE channel [channel …] 订阅给指定频道的信息。
  • PUBLISH channel message 将信息 message 发送到指定的频道 channel

Redis 事务

  • MULTI 开始事务
  • EXEC 执行包含的命令

例如:

      set dengchao 60000
      set wangbaoqiang 200
      multi
      INCRBY dengchao -10000
      INCRBY wangbaoqiang 10000
      EXEC

Redis 数据备份与恢复

  • SAVE 该命令将在 redis 安装目录中创建dump.rdb文件,如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可
  • CONFIG GET dir 获取 redis 目录
  • BGSAVE 后台执行备份

Redis 的配置文件

https://piaosanlang.gitbooks.io/redis/content/08_redispei_zhi_wen_jian.html

Redis 持久化

目前Redis持久化的方式有两种: RDB 和 AOF,同时开启时,优先使用 AOF 进行数据恢复

  • RDB 就是Snapshot快照存储,是默认的持久化方式。 可理解为半持久化模式,即按照一定的策略周期性的将数据保存到磁盘。 对应产生的数据文件为dump.rdb,快照的周期通过配置文件中的save参数来定义。
  • AOF(Append-only file)比RDB方式有更好的持久化性。 ** 在使用AOF持久化方式时,Redis会将每一个收到的写命令都通过Write函数追加到文件中,类似于MySQL的binlog。(所以AOF文件会比RDB文件更大,可通过 配置redis自动重写AOF文件 来减小AOF文件的大小) ** 当Redis重启是会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。

        appendonly yes         #启用aof持久化方式
        # appendfsync always   #每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
        appendfsync everysec     #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
        # appendfsync no #完全依赖OS的写入,一般为30秒左右一次,性能最好但是持久化最没有保证,不被推荐。
    

Redis 分布式锁的实现

传送门:点我

Redis 面试题

传送门:点我

lua脚本缓存

EVALSHA: 使用 shasum 执行缓存的脚本,

其他

为什么说Redis是单线程的以及Redis为什么这么快