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

开发系统: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

版权声明

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小白鼠

Mybatis

从xml配置文件中读取配置,然后通过SqlSessionFactoryBuilder构建SqlSessionFactory实例(建造者模式)。SqlSessio...

2693
来自专栏Web项目聚集地

手写一个Mybatis框架

在手写自己的Mybatis框架之前,我们先来了解一下Mybatis,它的源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,才能够更深入的理解源...

1022
来自专栏我的博客

Zend FrameWork之Zend_Db_Table笔记

根据Zend_Db_Table操作数据(也就是在models建立一个对应表的模型) 准备条件: course数据表中有cid课程号,自增,主键,cname课...

3533
来自专栏IMWeb前端团队

Redux源码解析系列(四)-- combineReducers

本文作者:IMWeb 黄qiong 原文出处:IMWeb社区 未经同意,禁止转载 combindeReducer 字面意思就是用来合并reducer的...

1957
来自专栏应兆康的专栏

Python Web - Flask笔记5

MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具。它是著名的数据库设计工具DBDesigner4的继任者。你可以用MySQL Wor...

1561
来自专栏MasiMaro 的技术博文

windows 纤程

纤程本质上也是线程,是多任务系统的一部分,纤程为一个线程准并行方式调用多个不同函数提供了一种可能,它本身可以作为一种轻量级的线程使用。它与线程在本质上没有区别,...

1582
来自专栏AhDung

【C#】递归搜索指定目录下的指定项目(文件或目录)

---------------更新:201411201121---------------

1122
来自专栏Fish

android文件存储

为了输出数据,要把list中存储的写到一个txt文件里,就顺手学了一下 文件存储的方法,说是学,其实又是百度之后复制粘贴。不过学到了一个关于java中的一个知识...

2279
来自专栏积累沉淀

干货--Hadoop自定义数据类型和自定义输入输出格式整合项目案例

正文开始前 ,先介绍几个概念 序列化 所谓序列化,是指将结构化对象转化为字节流,以便在网络上传输或写到磁盘进行永久存储。 反序列化 是指将字节流转回到结构化...

5956
来自专栏专注 Java 基础分享

Hibernate框架学习之注解映射实体类

     前面的相关文章中,我们已经介绍了使用XML配置文件映射实体类及其各种类型的属性的相关知识。然而不论是时代的潮流还是臃肿繁杂的配置代码告诉我们,注解配置...

2129

扫码关注云+社区

领取腾讯云代金券