Redis常见API

151 阅读6分钟

Redis

Redis 出现背景

redis 的作者在开发一个网站 LLOOGG.com 的时候,开始想使用MySQL作为数据库来实现访问记录用户访问网站的记录,可能由于当时的机器不太好,他就开发了redis的第一个版本来实现这个功能。

Redis 是什么

redis 是开源的。基于键值对的一款 NOSQL 数据库。

Redis 特性回顾

    * 速度快 (为什么快要知道) 官方给出每秒 10w 次 ops1·Q·(读写)
  • 持久化 (持久化方式要了解)
  • 多种数据结构(数据机构底层要了解)
  • 支持多种编辑语言 (java,php,python等)
  • 功能丰富 发布订阅 、事务、 lua 脚本 自定义功能、 pipline 提高并发
  • 主从复制
  • 简单 不依赖外部库、单线程模型。
  • 高可用(redis-sentinel)、分布式(redis-cluster)

Redis 典型使用场景

  • 缓存功能
  • 计数器 微博转发数 评论数
  • 消息队列 提供了发布订阅、阻塞队列
  • 排行榜
  • 社交网络
  • 实时系统

Redis 常用配置说明

  • daemonize 是否以守护进程的方式运行
  • port redis 对外暴露的端口号
  • logfile redis 系统日志
  • dir Redis 工作目录 :日志文件、持久化文件存在哪个目录

Redis 可执行文件

redis/src 下 ll | grep redis image.png

  • redis-benchmark redis 性能测试
  • redis-aof aof 修复
  • redis-dump rdb 修复
  • redis -cli redis 客户端
  • redis-server redis 启动命令

Redis 启动

redis-server -p <指定端口> redis-cli 使用配置文件启动

  • 修改配置文件 daemonize 为yes 然后执行以下命令。
  • redis-server <配置文件>

Redis API 使用和理解

通用命令

除了 keys 都是 O(1)

  • 删除一个键值对 del [key] del k1 true 1 false 0
  • 查询键 keys [pattern] 一般不在生产环境使用。会阻塞其他命令。 O(n)
    • * 匹配 0 ~ n 任意字符
    • [a-z] 单键查询范围
    • ? 匹配一个任意字符
  • key总数 dbsize O(1)
  • key是否存在 exists key
  • 设置过期时间 expire key seconds # key 在 seconds 秒后过期
  • 查询过期时间 ttl key -2 表示不存在了 -1 永不过期
  • 去掉过期时间 persist key
  • key的数据类型 type key

字符串

  • 场景

    • 缓存
    • 计数器
    • 分布式锁
  • API

    • get get key 获取 value n次网络时间 + n 次命令时间

    • set set key value 设置 k 的值 为 v

    • del del key 删除键值对

    • incr incr key 自增1 若key不存在返回 1

    • decr decr key 自减1 若key不存在返回-1

    • incrby incryby key k 增加k 若key 不存在 返回 k

    • decryby decrby key k 减少k 若key 不存在 返回 -k

    • set set key value key存在不存在都进行设置

    • setnx setnx key value key 不存在 才设置 相当于 add 操作

    • setex setex key value key 存在 才设置 相当于 update 操作

    • mget mget key1 key2 key3 原子操作

    • mset mset k1 v1 k2 v2 原子操作省去 n 次网络时间 数量大了要节制哦 几十万就去拆分 呀不然n次get 也会使系统变慢

    • getset getset key newValue 设置新的值,返回旧的值。

    • append append key value 将value 拼接到旧得value 后面。

    • strlen strlen key 返回key 得长度** 中文要根据编码** O(1)

    • getrange getrange key start end 获取 指定范围内得值 闭区间

    • setrange 设置指定下标所有对应的值

    • incrybyfloat 增加key 得值 浮点型

  • 实战

    • 记录每个用户个人主页的访问量(计数器)

      • incr userid:pageview (单线程、没有竞争,可以保证计数的结果正确)。
    • 缓存基本信息 (数据源在 MySQL中)提高接口访问性能和并发量。

      • 缓存命中、直接返回。不存在、访问MySQL,回写到缓存,在返回信息给用户。伪代码如下
      • String key = ...
      • result = redis.get(key)
      • reuslt == null result = mysql.getInfo() result != null redis.set(key,info)
      • return result
    • 分布式id生成器,并发情况下使得id自增

      • incr id(原子操作) 单线程 不会产生竞态条件。

Hash

image.png

  • 特点

    • value=[{field1,value1},...{fieldN,valueN}]。Hash 特别适合用于存储对象
    • 其中 filed 不可以相同,value 可以相同。
  • API

    • hget   获取key 对应得 field 的value hget key field
    • hset  设置 key 对应的 field 的value hset key field value
    • hdel  删除对应key的field 的value hdel key field
    • hexists   是否有field
    • hlen  获取 hahs key filed 的数量
    • hmget   一个key 一堆field 得到 一堆field 的value
    • hmset   一个key 一堆 field 和 value
    • hgetall 返回key 对应的所有field 和 value O(n)
    • hvals 返回 key 对应的所有field 的value O(n)
    • hkeys 返回 hash key 对应的所有field O(n)
  • 实战

    • 记录每个用户个人主页的访问量(计数器)
      • hincrby user:1:info pagevie count 用户属性是一个整体
    • 缓存基本信息 (数据源在 MySQL中)提高接口访问性能和并发量。
      • 思路与字符串相同,不同的是一个需要序列化和反序列化,而hash只需要进行transfor 将map 转为对象即可
      • 编程稍微复杂,ttl不好控制。

list

image.png

  • 特点

    • 有序
    • 可以重复
    • 左右两边插入和弹出
  • API

    • rpush k1 v1 k2 v2 从列表右端插入值

    • lpush

    • lpop 从左边弹出一个元素

    • rpop 从右边弹出一个元素

    • blpop key timout 阻塞弹出 对于类似生产者消费者模型非常有帮助。

    • linsert key befor|after value new value 在 list 指定 的值 前|后 插入 newvalue

    • lrem key count value

      • count = 0 所有与value 值相等的想
      • count > 0 , 从左到右,删除最多 count 个 与value 相等的项
      • count < 0 , 从右到左,删除最多 abs(count)个与 value 相等的项
    • ltrim key start end 保留链表 [start,end] 元素

    • 查找

      • lraange key start end 查 [staart,end] 所有元素
      • lindex key index 查索引值 O(n)
      • llen 获取列表长度
      • lset key index value O(n)
  • 实战

    • 维护最新数据
      • 类似栈,每次拿栈顶元素。
  • 总结

    • LPUSH + LPOP = 栈
    • LPUSH + RPOP = 队列
    • LPUSH + LTRIM = 定长集合
    • LPUSH + BRPOP = 消息队列

image.png

Set 集合

image.png

  • 特点

    • 不允许重复元素
    • 无序
    • 支持集合操作
  • API

    • 交集操作 sinter k1 k2
    • 差集操作 sdiff k1 k2
    • 并集操作 sunion k1 k2
    • 添加 sadd key element
    • 删除 srem key element
    • 计算集合大小 scard
    • 集合元素是否存在 sismember key value
    • 集合中随机挑选count 个元素 srandmember key count只是选,不会弹出
    • 集合中随机弹出一个元素 spop 是会弹出的
    • 集合中所有元素 smembers 无序 小心使用
    • SUNIONSTORE destination key [key ...]
  • 实战

    • 抽奖系统 spop 或 使用 srandmember 取出count 个 在进行删除
    • 赞、踩 ,一个用户只能赞一次或者踩一次
    • 标签 :添加不同标签。
    • 标签添加用户
    • 共同关注:sinterstorge dest k1 k2
  • 总结 SADD = 标签 SPOP/SRANDOMMEMBER = 随机/抽奖 SDD + SUNION = 社交圈/共同关注

有序集合

image.png

  • API
    • ZADD KEY SCORE ELEMNT O(logn)
    • ZREM KEY ELEMENT O(1)删除元素
    • ZSCORE KEY ELEMENT 获取分数
    • ZINCRBY KEY SCORE ELEMENT 给 element 增加分数
    • ZCARD 返回元素个数
    • ZRANGE KEY START END [withscore] O(logn + m) 获取 [start,end] 范围内升序元素
    • ZRANGEBYSCORE KEY minScore maxScore O(logn + m)
    • ZREMRANGEBYRANK key start end 删除 排名 [start,end] 的元素
    • ZREMRANGEBYScore key min max 删出 [min.max] score 的元素
    • ZREVRABK KEY 倒数第几
    • 集合操作 zinterstore
    • zunionstore
  • 实战
    • 排行榜
      • zadd 依次增加。zrange 获取一定范围内的榜单。