Redis-02-Redis入门

2. Redis基础

2.1 常用命令

命令 描述
SET key value 最简单的增加一个值
DEL key 从当前数据库中删除key
EXISTS key 判断该key在当前数据库中是否存在
EXPIRE key seconds 给key设置过期时间
KEYS pattern 通过正则表达式查找key
MOVE key db 将指定的key移动到指定的数据库中
TTL key 查看key的过期时间
TYPE key 查看key的类型
SELECT index 选择数据库
FLUSHDB 清空当前数据库
FLUSHALL 清空redis

2.2 五大基本数据类型

1. String

  • String是Redis中最基本的数据类型

  • 常用命令

    命令 说明
    SET key value 设置key的值为value
    GET key 获取key的值
    GETRANGE key start end 获取key的子串
    SETRANGE key offset value 从offset开始修改key的值
    GETSET key value 先get再set,返回旧key的值
    STRLEN key 获取key的长度
    INCR(DECR) key 自增1或自减1
    INCRBY(DECRBY) key increment 自增或自减步长
    APPEND key value 在key的后面追加内容
    SETEX key seconds value 带有过期时间的设置key-value
    SETNX key value 如果key不存在,则设置key-value
    MGET key1 [key2..] 获取多个key的值
    MSET key value [key value ...] 同时设置多个key
    MSETNX key value [key value ...] 同时设置多个不存在的key,原子操作

2. List

  • Redis的List在底层是使用双向链表实现的

    • 优点:在头部或尾部操作的时间复杂度是O(1)
    • 缺点:根据索引访问元素时间复杂度是O(n)
  • 为什么使用链表而不使用数组?

    • 对于数据库系统来说,至关重要的特性是:能非常快的在很大的列表上添加元素。另一个重要因素是,正如你将要看到的:Redis lists能在常数时间取得常数长度。
  • 常用操作

    命令 说明
    LPUSH key value1 [value2] 列表头部插入
    RPUSH key value1 [value2] 列表尾部插入
    LPOP key 移除第一个元素
    RPOP key 移除最后一个元素
    LLEN key 获取列表的长度
    LRANGE key start stop 截取列表
    LREM key count value 根据内容移除列表中指定元素
    LINDEX key index 获取元素的下标
    LSET key index value 根据下标设置元素
    LTRIM key start stop 保留指定区间中的元素
    RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
    LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素

3. Hash

  • Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象

  • 常用操作

    命令 说明
    HSET key field value 设置一个字段的值
    HGET key field 获取指定字段的值
    HDEL key field1 [field2] 删除指定字段
    HEXISTS key field 判断字段是否存在
    HGETALL key 获取所有的字段和值
    HKEYS key 获取所有的字段
    HVALS key 获取所有的值
    HLEN key 获取字段的数量
    HINCRBY key field increment 递增指定长度
    HSETNX key field value 如果不存在则设置字段
    HMSET key field1 value1 [field2 value2 ] 设置多个字段
    HMGET key field1 [field2] 获取多个字段

4. Set

  • Set是String类型的无序集合,其中内容不可重复

  • Set的底层是哈希表, 所以他具有 O(1) 级别的增加、删除、获得操作

  • 常用操作

    命令 说明
    SADD key member1 [member2] 向集合中添加元素
    SCARD key 获取集合中元素个数
    SMEMBERS key 获取集合中全部的元素
    SISMEMBER key member 判断元素是否在集合中
    SREM key member1 [member2] 从集合中移除指定元素
    SRANDMEMBER key [count] 随机获取指定数量的元素
    SPOP key 随机移除一个元素
    SMOVE source destination member 移动集合中元素的位置
    SDIFF key1 [key2] key1相对于key2的补集
    SINTER key1 [key2] 交集
    SUNION key1 [key2] 并集

5. Ordered Set,有序集合

  • 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的score。这个score是Redis排序的依据

  • 和(无序)集合一样,有序集合的底层也是哈希表,所以他具有 O(1) 级别的增加、删除、获得操作

  • 常用操作

    命令 说明
    ZADD key score1 member1 [score2 member2] 添加元素
    ZREM key member [member ...] 移除元素
    ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 按照score区间,升序排序集合
    ZREVRANGEBYSCORE key max min [WITHSCORES] 按照score区间,降序排序
    ZRANGE key start stop [WITHSCORES] 根据索引获取内容
    ZCARD key 获取集合中的全部元素个数
    ZCOUNT key min max 指定score区间中的元素个数
    ZRANK key member 获取指定元素在升序排序中的位置
    ZREVRANK key member 获取指定元素在降序排序中的位置

2.3 三种特殊数据类型

1. Geospatial,地理位置

  • GEO 主要用于存储地理位置信息,并对存储的信息进行操作,

  • GEO底层的数据结构是Sorted Set,在存储经纬度信息时,Redis会将经纬度信息转换成52位的整数,作为Sorted Set的score

  • 常用命令

    • GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member ...]
      • 添加地理位置
    • GEODIST key member1 member2 [m|km|ft|mi]
      • 获取两个地理位置之间的坐标
    • GEOHASH key member [member ...]
      • 获取地理位置的geohash表示
    • GEOPOS key member [member ...]
      • 获取指定位置的地理坐标
    • GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key]
      • 在给定位置,按照半径查找
    • GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key]
      • 在给定位置,按照半径查找,和 GEORADIUS 不同的是 GEORADIUSBYMEMBER 中的中心店是Redis中的 key
  • 扩展

    • GEOSEARCH key [FROMMEMBER member] [FROMLONLAT longitude latitude] [BYRADIUS radius m|km|ft|mi] [BYBOX width height m|km|ft|mi] [ASC|DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH]

    • 这个命令是 Redis 6.2之后新增加的,它是基于GEORADIUS 的扩展命令,可以设置按照圆形区域或者矩形区域去查询范围内的元素

2. Hyperloglog

  • Redis HyperLogLog 是用来做基数统计的算法

  • HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的,最多使用12kb

  • 这是因为Redis只计算不同的元素个数,并不存储元素本身,因此HyperLogLog 存在一定范围内的误差,官方给出的误差范围小于 1%

  • 使用场景示例:计算某个网页的访问量

  • 常用命令

    命令 说明
    PFADD key element [element ...] 添加一个元素
    PFCOUNT key [key ...] 获取其中元素个数
    PFMERGE destkey sourcekey [sourcekey ...] 合并 HyperLogLog

3. Bitmap

  • bitmap并不是一个真正意义上的数据结构

  • bitmap采用二进制的形式存储内容,这意味着能存储的内容只能具有0和1两种状态。因此,bitmap常常用来存储一些标志量,比如说打卡记录、是否登记等这类只有两种状态的信息

  • bitmap的底层也是String类型,只不过它定义了再二进制位上的一些操作

  • 常用指令

    命令 说明
    SETBIT key offset value 设置具体位的值
    GETBIT key offset 获取某一位的值
    BITCOUNT key [start end] 获取整个String中1的数量

2.4 发布订阅

  • Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。

  • Redis 客户端可以订阅任意数量的频道。

  • 订阅示例图

    img

  • 消息推送示例图

    img

  • 常用命令

    命令 描述
    PSUBSCRIBE pattern [pattern ...] 正则表达式订阅频道
    PUBSUB subcommand [argument [argument ...]] 查看订阅系统状态
    PUBLISH channel message 发布消息
    PUNSUBSCRIBE [pattern [pattern ...]] 正则表达式退订频道
    SUBSCRIBE channel [channel ...] 订阅频道
    UNSUBSCRIBE [channel [channel ...]] 退订频道
  • 底层

    • Redis是使用C实现的,通过分析 Redis 源码里的 pubsub.c 文件,了解发布和订阅机制的底层实现,籍此加深对 Redis 的理解。
    • Redis 通过 PUBLISH 、SUBSCRIBE 和 PSUBSCRIBE 等命令实现发布和订阅功能。
    • 通过 SUBSCRIBE 命令订阅某频道后,redis-server 里维护了一个字典,字典的键就是一个个 channel,而字典的值则是一个链表,链表中保存了所有订阅这个 channel 的客户端。
      • SUBSCRIBE 命令的关键,就是将客户端添加到给定 channel 的订阅链表中。
    • 通过 PUBLISH 命令向订阅者发送消息,redis-server 会使用给定的频道作为键,在它所维护的 channel字典中查找记录了订阅这个频道的所有客户端的链表,遍历这个链表,将消息发布给所有订阅者。
    • Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。
    • 使用场景
      • Pub/Sub构建实时消息系统
      • Redis的Pub/Sub系统可以构建实时的消息系统
      • 比如很多用Pub/Sub构建的实时聊天系统的例子
posted @ 2021-01-30 21:01  PrimaBruceXu  阅读(61)  评论(0编辑  收藏  举报