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

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

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

核心对象

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

RedisObject

图片来自:对象处理机制

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中对于输入的命令会有智能提示

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
  • LIST
命令 作用
LPUSH 将一个或多个值推入列表左端
RPUSH 将一个或多个值推入列表右端
LPOP 移除并返回列表最左端的值
RPOP 移除并返回列表最右端的值
LINDEX 根据索引获取LIST中的值
LRANGE 获取LIST中索引在指定范围内的值
LTRIM 从LIST中删除索引不在指定范围内的值,这里的索引范围是闭区间
  • HASH
HSET
命令 作用
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三种数据结构中的值进行排序操作,默认是正序排列。

sort

Publish & Subscribe

发布/订阅模式

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

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


pub/sub

Transcation

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

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


transaction

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

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

transaction in 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本身之后,可以很快的掌握第三方驱动的使用。

推荐工具

RedisDesktopManager

推荐图书

  • Redis in Action
RedisInAction

参考文章

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容