Redis中的数据结构与常用命令

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 开发系统:Ubuntu 17.04Redis驱动:StackExchange.Redis 1.2.3Redis版本:3.2.1开发平台:.NET Core 对于Redis的介绍这里只写一句:Redis是一种基于内存的高性能非关系型数据库,它以kye-value的形式来存储数据。

 

开发系统:Ubuntu 17.04
Redis驱动:StackExchange.Redis 1.2.3
Redis版本:3.2.1
开发平台:.NET Core

对于Redis的介绍这里只写一句:Redis是一种基于内存的高性能非关系型数据库,它以kye-value的形式来存储数据。

核心对象

RedisObject,图片来自:从搭建到应用,一文读懂Redis

 
 

Redis五种数据结构对应的编码方式,图片来自:对象处理机制

 
 

编码指的是五种数据类型在Redis内部的存储方式,一种数据类型可对应多个编码方式。

5种数据类型

Redis中包含5种数据类型:STRING、LIST、SET、HASH、ZSET。

Redis中的5中数据结构(截图出自《Redis in Action》):


 

Redis以key-value形式存储数据,其中key与value的关系可分为两种

  • 1对1
    在Redis的STRING数据结构中,一个key对应一个value。
  • 1对*
    Redis中的其余四种数据结构,一个key可以对应多个value。

为了更直观的说明key和value间的关系,下面用几张图(截图来自《Redis in Action》)来描述Redis中的五种数据结构:

STRING结构


 
LIST结构

 
SET结构

HASH结构
 

 
ZSET结构

 

其中:
SET和ZSET中没有重复元素;
相比SET,ZSET具有排序功能;
ZSET和HASH的value也是键值对形式:ZSET(score,member)、HASH(field,value);
STRING类型中不仅仅是存储字符,也可以存储数值(整数、浮点数);
5种数据结构最终存储的数据类型实际只有两种:字符和数值,Redis能够区分存储的值是字符还是数字;

Redis中常用命令

在redis-cli中对于输入的命令会有智能提示


 
命令 作用
HELP 获取命令的帮助信息,学会help命令很重要
DEL 删除key及对应的值
EXPIRE 设置键的过期时间,过期的键连同与该键相关的数据都将被删除
 
help命令:
 

 
  • STRING

    Redis对字符串提供了丰富的操作,在Redis中STRING结构用于存储两种类型的数据:
    • 数值(整数、浮点数)
    • 字符串(byte string)
命令 作用
SET 向指定的key中写入值
GET 从指定的key中获取值
INCR 将指定key的值加1
DECR 将指定key的值减1
INCRBY 将指定key的值加上指定的数值
DECRBY 将指定key的值减去指定的数值
APPEND 向value中追加内容
GETRANGE GETRANGE key-name start end获取指定索引范围(字符串可看作是字符组成的数组)的字符,当start=0且end=-1时获取整个字符串
SETRANGE `设置指定偏移量的字符的值
GETBIT GETBIT key-name offset 将字符串看做是二进制形式(bit string),并返回指定偏移量位置处的二进制位的值
SETBIT 设置指定偏移量位置处的二进制位的值
BITCOUNT 返回字符串中二进制位值为1的二进制位数
BITOP 对字符串执行位运算,并将计算结果存储到指定的key中

对于BITCOUNT命令,专门写了一段程序进行验证,效果图如下:

c#代码:
 
 
redis-cli中执行bitcount命令的结果:

 
  • LIST

命令 作用
LPUSH 将一个或多个值推入列表左端
RPUSH 将一个或多个值推入列表右端
LPOP 移除并返回列表最左端的值
RPOP 移除并返回列表最右端的值
LINDEX 根据索引获取LIST中的值
LRANGE 获取LIST中索引在指定范围内的值
LTRIM 从LIST中删除索引不在指定范围内的值,这里的索引范围是闭区间
  • HASH


 
命令 作用
HSET 向HASH表中添加元素,由上图可以看出HASH结构中存储的值也是一个键值对(field value)
HMSET 一次向HASH表中写入多个键值对
HGET 获取HASH中存储的值
HMGET 一次从HASH中获取多个值
HLEN 获取HASH表中存储的元素个数
HDEL 删除HASH表中的键值对
HEXISTS 判断HASH中是否包含指定field的键值对
HKEYS 获取HASH中的所有键(field)
HVALS 获取HASH中的所有值
HGETALL 获取HASH中的所有键值对
HINCRBY 将HASH中的指定value增加指定的数值
  • SET

    SET中没有重复元素,向SET中添加重复的数据只会存储一份。
命令 作用
SADD 向SET中添加元素
SREM 移除SET中的元素
SISMEMBER 判断某元素是否存在于SET中
SCARD 返回SET中的元素个数
SMEMBERS 返回SET中的所有元素
SSCAN 通过迭代的方式返回SET中的所有元素
SMOVE 将元素从某一集(如果该元素存在当前集合中)合移动到另一集合并返回当前元素

集合间运算

命令 作用
SDIFF 对SET集合进行补集运算(存在于第一个集合且不存在于第二个集合中的元素)并返回运算结果
SDIFFSTORE 对SET集合进行补集运算并将运算结果存储到一个新的SET集合中
SINTER 对SET集合进行交集运算并返回运算结果
SINTERSTORE 对SET集合进行交集运算并将运算结果存储到一个新的SET集合中
SUNION 对SET集合进行并集运算并返回运算结果
SUNIONSTORE 对SET集合进行并集运算并将运算结果存储到一个新的SET集合中
  • ZSET

    ZSET和SET一样,没有重复元素,但和SET相比它有排序功能。
命令 作用
ZADD 向ZSET中添加元素
ZREM 移除ZSET中的元素
ZCARD 获取ZSET中元素的个数
ZSCORE 获取ZSET中元素的score值
ZRANK 获取ZSET中元素的索引
ZREMRANGEBYRANK 从ZSET中移除指定索引范围内的元素
ZREMRANGEBYSCORE 从ZSET中移除指定score范围内的元素
ZCOUNT 获取ZSET中score值在指定范围内元素的个数
ZRANGE 获取ZSET中索引在指定范围内的元素,ZRANGE key start stop,参数start=0且stop=-1时返回所有元素

集合间运算

命令 作用
ZINTERSTORE 对ZSET集合进行交集运算并将运算结果存储到一个新的ZSET集合中
ZUNIONSTORE 对ZSET集合进行并集运算并将运算结果存储到一个新的ZSET集合中

集合运算对于value值相同的集合元素score值的处理分为三种方式:

  1. 求和
  2. 取最大值
  3. 取最小值

执行ZINTERSTORE命令(ZUNIONSTORE与之类似):

  • 参数destination表示用于存储计算结果的集合的key
  • 参数numkeys表示参与运算的集合数,必选
  • AGGREGATE表示对score的操作方式,默认为SUM
  • 参数WEIGHTS表示权重,该参数比较复杂:

    • 参数WEIGHTS的个数和numkyes值相等

    • AGGREGATE值为SUM时,对于结果集中的某个value为a的元素B,参与运算的各个集合中value为a的元素的score值会分别和对应的WEIGHTS值相乘然后再将各自相乘结果相加作为结果集中元素B的score值

    • AGGREGATE值为MIN或MAX时,对于结果集中的某个value为a的元素B,参与运算的各个集合中value为a的元素中score值最小或最大的那个(若有多个,则按照命令行中指定集合的顺序自左向右取第一个符合条件的集合中的元素)和对应的WEIGHTS值相乘得到的值作为结果集中元素B的score值

规则略复杂,自己动手写几遍就会明白了。ZINTERSTORE命令执行效果图:


 

以下为进行集合运算的示意图:
以对score求和的方式进行交集运算


 

以取score中最小值的方式进行并集运算


 

以对score求和的方式进行并集运算


Sort

对LIST、SET、ZSET三种数据结构中的值进行排序操作,默认是正序排列。


 

Publish & Subscribe

发布/订阅模式

命令 作用
PUBLISH 向指定的频道发送二进制字符串消息(binary string messages)
SUBSCRIBE 订阅指定的频道已接受该频道发送的消息
UNSUBSCRIBE 取消订阅某频道

下图中展示的是使用redis-cli和stackexchange.redis进行的pub/sub测试效果:


 

Transcation

命令 作用
MULTI 表示事务的开始
EXEC 执行事务中包含的命令

Redis中事务(调用MULTI表示事务的开始)所包含的命令会被放到一个队列中,当遇到EXEC命令后会不间断的依次执行队列中的命令。


 

Redis中的事务和数据库中的事务不同,它没有回滚操作。

Redis中的事务,若某行命令执行失败不会影响其它命令的执行(下图中第二行命令执行失败,第一、三行成功执行):


 

StackExchange.Redis

StackExchange.Redis驱动是用C#语言写的Redis驱动,它的API在语义上和Redis命令是类似的,在这里列举下驱动中常用的几个类:

  • ConnectionMultiplexer
    表示一组相关的Redis服务器链接,StackExchage.Redis官方建议尽可能复用该对象。

  • IDatabase
    该接口中定义了对5种数据结构进行操作的方法

  • RedisDatabase
    IDatabase的实现类

  • RedisKey
    存储到Redis中的key

  • RedisValue
    存储到Redis中的value,可用于表示STRING、LIST、SET结构中存储的数据

  • HashEntry
    表示一个HASH键值对

  • SortedSetEntry
    表示一个ZSET元素

  • ISubscript
    订阅接口

  • RedisChannel
    表示发布/订阅中的频道名

  • Subscription
    ConnectionMultiplexer中的私有密封类,封装和订阅相关的信息

结语

Redis是一种NoSql数据库,Redis服务器上默认有16个数据库,Redis常被拿来和Memcache做比较,网上有很多这方面的文章,各位看官请自行搜索。本文着重介绍了Redis中的5中数据结构和一些常用的命令,对于第三方驱动则一笔带过,因为在了解了Redis本身之后,可以很快的掌握第三方驱动的使用。

推荐工具


 

推荐图书

  • Redis in Action

参考文章

An introduction to Redis data types and abstractions
从搭建到应用,一文读懂Redis
对象处理机制
深入剖析 redis 数据结构 redisObject

版权声明

本文为作者原创,版权归作者雪飞鸿所有。 转载必须保留文章的完整性,且在页面明显位置处标明原文链接

如有问题, 请发送邮件和作者联系。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
28天前
|
存储 消息中间件 NoSQL
Redis数据结构:List类型全面解析
Redis数据结构——List类型全面解析:存储多个有序的字符串,列表中每个字符串成为元素 Eelement,最多可以存储 2^32-1 个元素。可对列表两端插入(push)和弹出(pop)、获取指定范围的元素列表等,常见命令。 底层数据结构:3.2版本之前,底层采用**压缩链表ZipList**和**双向链表LinkedList**;3.2版本之后,底层数据结构为**快速链表QuickList** 列表是一种比较灵活的数据结构,可以充当栈、队列、阻塞队列,在实际开发中有很多应用场景。
|
2月前
|
存储 消息中间件 NoSQL
Redis 数据结构与对象
【10月更文挑战第15天】在实际应用中,需要根据具体的业务需求和数据特点来选择合适的数据结构,并合理地设计数据模型,以充分发挥 Redis 的优势。
55 8
|
2月前
|
存储 NoSQL Java
介绍下Redis 的基础数据结构
本文介绍了Redis的基础数据结构,包括动态字符串(SDS)、链表和字典。SDS是Redis自实现的动态字符串,避免了C语言字符串的不足;链表实现了双向链表,提供了高效的操作;字典则类似于Java的HashMap,采用数组加链表的方式存储数据,并支持渐进式rehash,确保高并发下的性能。
介绍下Redis 的基础数据结构
|
20天前
|
存储 NoSQL Java
Redis命令:列表模糊删除详解
通过本文的介绍,我们详细探讨了如何在Redis中实现列表的模糊删除。虽然Redis没有直接提供模糊删除命令,但可以通过组合使用 `LRANGE`和 `LREM`命令,并在客户端代码中进行模糊匹配,来实现这一功能。希望本文能帮助你在实际应用中更有效地操作Redis列表。
32 0
|
2月前
|
缓存 NoSQL 测试技术
Redis如何解决频繁的命令往返造成的性能瓶颈!
Redis如何解决频繁的命令往返造成的性能瓶颈!
|
2月前
|
消息中间件 存储 缓存
redis支持的数据结构
redis支持的数据结构
32 2
|
28天前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
28天前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
2月前
|
NoSQL Redis 数据安全/隐私保护
Redis 命令
10月更文挑战第15天
28 0
|
存储 NoSQL 算法
「Redis」数据结构与对象
Redis数据结构与对象介绍
下一篇
无影云桌面