写点什么

Redis 基础

作者:武师叔
  • 2022 年 8 月 12 日
    辽宁
  • 本文字数:3466 字

    阅读完需:约 11 分钟

Redis 基础

Redis 基础

  1. 在 Redis 中单个指令都是原子性操作,通过指令操作 Redis 数据时无需担心线程安全问题。

  2. Redis 以 key-value 的形式保存数据:key 值一定为 string 类型,而 value 值支持以下五种基础类型:


存储区域

Redis 将数据存储分为多个相互独立的区域,将 Redis 操作局限在自己的存储区域内。通常划分为 16 个(编号 0-15),默认使用编号 0 。


> select 1                         # 改用 1 号存储区域
> dbsize # 返回当前区域 key 数量> move key 2 # 将当前 key 迁移到 2 号存储区域> flushdb # 清空当前存储区域> flushall # 清空全部存储区域Copy to clipboardErrorCopied
复制代码

key 操作

基本操作


> del key                            # 删除 key> exists key                         # 判断是否存在 key> type key                           # 返回 key 对应的 value 类型       
> rename key newkey # 重命名> renamenx key newkey # 重命名(返回 1),新名称已存在则失败(返回 0)> sort # 对 key 排序Copy to clipboardErrorCopied
复制代码


时效性控制


Redis 中可以为 key 设置有效期,key 过期后会由 Redis 执行删除策略回收内存空间。


> expire key 10                      # key 10s 内有效> expireat key 1355292000            # key 截至时间戳有效> persist key                        # key 永久有效
> ttl key # 返回 key 剩余有效时间,若不存在返回 -2 ,永久返回 -1Copy to clipboardErrorCopied
复制代码


查询操作


Redis 支持查询存储区域内含有的 key,且允许使用以下通配符:


  • * 表示任意数量字符

  • ? 表示任意一个字符

  • [] 表示一个指定字符


> keys *                             # 查询所有 key> keys user:*                        # 查询所有 user 的 key> keys id:75??                       # 查询 ID 为 7500-7599 的 key> keys id:7[2345]55                  # 查询 ID 为 7255/7355/7455/7555 的 keyCopy to clipboardErrorCopied
复制代码

基础类型

string 类型

Redis 的 string 类型中,key 值对应的存储空间内将保存一个字符串数据,


key 值标准命名格式为 表名:主键名:主键值:字段名,如 user:id:15942348:name - "王东浩"


基本操作


> set key 10                     # 设置键值对> get key                        # 获取键值,不存在则返回 nil> del key                        # 删除键值对> strlen key                     # 获取价值的字符串长度> append key 0                   # 在键值尾部追加
> mset key1 10 key2 100 # 设置多个数据> mget key1 key2 # 获取多个数据
> setex key 10 1 # 设置键值对,10s 后自动删除> psetex key 10 1 # 设置键值对,10ms 后自动删除Copy to clipboardErrorCopied
复制代码


数据操作


如果字符串为合法数字,可以当作数字处理。但数值不能超过 shell 中的 long 类型。


> incr key                       # 键值加一> decr key                       # 键值减一> incrby key 10                  # 键值加十> decrby key 10                  # 键值减十> incrbyfloat key -1.5           # 键值加 -1.5Copy to clipboardErrorCopied
复制代码

hash 类型

hash 类型中,key 值对应的存储空间内可以保存多个键值对(field-value):field 和 value 都必须是字符串类型。当键值对较少时存储空间内采用数组存储,当键值对较多时采用哈希存储。


十分适合存储对象,每个键值对记录对象的一个属性。



基本操作


> hset key field 10               # 设置/更新键值对> hsetnx key field 10             # 如果键值不存在则设置键值对> hget key field                  # 获取键值> hgetall key                     # 获取全部键值> hdel key field                  # 删除键值对> hlen key                        # 获取键值对数量> hexists key field               # 判断是否存在字段(返回 1 或 0)
> hmset key field1 1 field2 2 # 设置/修改多个键值对> hmget key field1 field2 # 获取多个键值对Copy to clipboardErrorCopied
复制代码


扩展操作


> hkeys key                       # 返回 key 对应的所有 field> hvals key                       # 返回 key 对应的所有 value
> hincrby key field 1 # 键值加一> hdecrby key field 1 # 键值减一Copy to clipboardErrorCopied
复制代码

list 类型

list 类型中,key 值对应的存储空间内可以保存多个字符串数据,采用双向链表实现。具有索引的概念,但还是更适合从链表两侧操作。字符串总容量不能超过 2 的 32 次方。


十分适合存储有序信息,比如粉丝列表。


基本操作


lpush list 1                    # 链表左侧插入数据,返回下标rpush list 2                    # 链表右侧插入数据,返回下标lpop list                       # 获取并删除最左侧数据rpop list                       # 获取并删除最右侧数据blpop list 10                   # 获取并删除最左侧数据,不存在则至多等待 10 slrem list 3 x                   # 从左侧开始,删除三个为 x 的数据
lrange list 0 2 # 返回左侧前3个数据lrange list 0 -1 # 返回全部数据(常用)lindex list 0 # 返回指定位置数据llen list # 返回字符串个数Copy to clipboardErrorCopied
复制代码

set 类型

set 类型中,key 值对应的存储空间内可以保存多个字符串数据,采用哈希存储实现。随机查询效率比 list 类型更高。字符串总容量不能超过 2 的 32 次方。


十分适合存储集合类信息,比如用户感兴趣的话题、用户权限。


基本操作


sadd set member                  # 添加数据(可以是多个)srem set member                  # 删除数据(可以是多个)smembers set                     # 展示全部数据  
scard set # 返回数据个数sismember set # 判断是否含有数据
srandmember set 5 # 随机从集合中选取 5 个数据spop set # 返回并删除一个随机数据Copy to clipboardErrorCopied
复制代码


扩展操作


sinter set1 set2                   # 交sunion set1 set2                   # 并sdiff set1 set2                    # 差sinterstore newset set1 set2       # 交且存入新集合sunionstore newset set1 set2       # 并且存入新集合sdiffstore newset set1 set2        # 差且存入新集合
smove oldset newset 5 # 数据从旧集合迁移到新集合Copy to clipboardErrorCopied
复制代码

sorted_set 类型

如果我们需要数据查询效率较高且有序,则可以使用 sorted_set 类型。底层和 set 结构相同采用哈希存储(value 值仍不可重复),但在 key-value 存储结构后添加 score 属性为数据排序,默认从小到大。score 是数字且可以使用小数,但如果使用小数浮点类型可能会出现精度丢失。


可以用来存储排行榜等有序数据集合,还可以用于存储时效性或者带有权重的任务队列,用当前时间或者权重作为 score 。


基本操作


zadd set score1 member             # 添加数据且标记序号(可以是多个)Copy to clipboardErrorCopied
复制代码

高级类型

此外,Redis 还提供了 Bitmaps、 HyberLogLog、GEO 三种高级数据类型,用来适配特定的应用场景。

Bitmaps 类型

Bitmaps 类型中用作存储布尔值:每个 key 对应若干字节数据(字节数 = 最大编号 / 8),每字节可以存储 8 个 boolean 值。


如果 Redis 要存储大量 boolean 值,使用 Bitmaps 类型可以显著节省内存空间。


setbit bits 0 1                  # 将 0 位置为 1(true)getbit bits 0                    # 取 0 位的值Copy to clipboardErrorCopied
复制代码

HyperLogLog 类型

HyperLogLog 类型用作数据统计,只记录数量不保存数据,且当数据量巨大时存在误差!


使用 HyperLogLog 类型可以显著节省内存空间,每个 key 仅占用 12k 内存标记基数。


setbit bits 0 1                  # 将 0 位置为 1(true)getbit bits 0                    # 取 0 位的值Copy to clipboardErrorCopied
复制代码

GEO 类型

GEO 类型用作地理位置计算,根据经纬度。

发布于: 刚刚阅读数: 4
用户头像

武师叔

关注

每天丰富自己,去过自己想要的生活! 2022.04.28 加入

一个喜欢最新技术,研发的人工智能专业的大二学生,用自己的代码做一些有意义的事情! 目前大二结束有去大厂研发岗实习的计划,每天丰富自己的技术,去过自己想要的实习生活。

评论

发布
暂无评论
Redis 基础_8月月更_武师叔_InfoQ写作社区