设为首页 收藏本站
查看: 2428|回复: 0

[经验分享] Redis中的数据结构与常用命令

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-12-20 15:32:50 | 显示全部楼层 |阅读模式
  开发系统:Ubuntu 17.04
  Redis驱动:StackExchange.Redis 1.2.3
  Redis版本:3.2.1
  开发平台:.NET Core
  对于Redis的介绍这里只写一句:Redis是一种基于内存的高性能非关系型数据库,它以kye-value的形式来存储数据。
5种数据结构
  Redis中包含5种数据类型:STRING、LIST、SET、HASH、ZSET。
  Redis中的5中数据结构(截图出自《Redis in Action》):
DSC0000.jpg

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

  • 1对1  在Redis的STRING数据结构中,一个key对应一个value。
  • 1对*  Redis中的其余四种数据结构,一个key可以对应多个value。
  为了更直观的说明key和value间的关系,下面用几张图(截图来自《Redis in Action》)来描述Redis中的五种数据结构:
  STRING结构
DSC0001.jpg

LIST结构 DSC0002.jpg SET结构 DSC0003.jpg HASH结构 DSC0004.jpg ZSET结构 DSC0005.jpg   其中:
  SET和ZSET中没有重复元素;
  相比SET,ZSET具有排序功能;
  ZSET和HASH的value也是键值对形式:ZSET(score,member)、HASH(field,value);
  STRING类型中不仅仅是存储字符,也可以存储数值(整数、浮点数);
  5种数据结构最终存储的数据类型实际只有两种:字符和数值,Redis能够区分存储的值是字符还是数字;
Redis中常用命令
  在redis-cli中对于输入的命令会有智能提示
DSC0006.jpg

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

  • STRING
    Redis对字符串提供了丰富的操作,在Redis中STRING结构用于存储两种类型的数据:

    • 数值(整数、浮点数)
    • 字符串(byte string)

命令作用SET向指定的key中写入值GET从指定的key中获取值INCR将指定key的值加1DECR将指定key的值减1INCRBY将指定key的值加上指定的数值DECRBY将指定key的值减去指定的数值APPEND向value中追加内容GETRANGEGETRANGE key-name start end获取指定索引范围(字符串可看作是字符组成的数组)的字符,当start=0且end=-1时获取整个字符串SETRANGE`设置指定偏移量的字符的值GETBITGETBIT key-name offset 将字符串看做是二进制形式(bit string),并返回指定偏移量位置处的二进制位的值SETBIT设置指定偏移量位置处的二进制位的值BITCOUNT返回字符串中二进制位值为1的二进制位数BITOP对字符串执行位运算,并将计算结果存储到指定的key中  对于BITCOUNT命令,专门写了一段程序进行验证,效果图如下:
c#代码: DSC0008.jpg   redis-cli中执行bitcount命令的结果: DSC0009.jpg

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

  • HASH
DSC00010.jpg 命令作用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值的处理分为三种方式:

  • 求和
  • 取最大值
  • 取最小值
  执行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命令执行效果图:
DSC00011.jpg

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

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

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

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

Publish & Subscribe
  发布/订阅模式
命令作用PUBLISH向指定的频道发送二进制字符串消息(binary string messages)SUBSCRIBE订阅指定的频道已接受该频道发送的消息UNSUBSCRIBE取消订阅某频道  下图中展示的是使用redis-cli和stackexchange.redis进行的pub/sub测试效果:
DSC00016.jpg

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

  Redis中的事务和数据库中的事务不同,它没有回滚操作。
  Redis中的事务,若某行命令执行失败不会影响其它命令的执行(下图中第二行命令执行失败,第一、三行成功执行):
DSC00018.jpg

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 Desktop Manager
DSC00019.jpg 推荐图书

  • Redis in Action
DSC00020.jpg 参考文章
  An introduction to Redis data types and abstractions

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-426089-1-1.html 上篇帖子: PHP操作redis 下篇帖子: .NET客户端实现Redis中的管道(PipeLine)与事物(Transactions)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表