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

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

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

版权声明

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

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

时间: 2024-11-04 15:04:31

Redis中的数据结构与常用命令的相关文章

Redis中有序集合的常用命令有哪些?

本文和大家分享的主要是redis 中有序集合类型的常用命令,一起来看看吧,希望对大家 学习redis有所帮助. 一.有序集合类型 有序集合类型,大家从名字上应该就可以知道,实际上就是在集合类型上加了个有序而已.Redis 中的有序集合类型,实际上是在集合类型上,为每个元素都关联一个分数,有序实际上说的是分数有序,我们根据分数的范围获取集合及其他操作.集合的元素依然是不能够相同的,但是分数可以相同. 下面列举有序集合和类型和列表类型的相似处: ① 两者都是有序的(废话!) ② 两者都可以获得某一范

Redis系列(二):Redis的5种数据结构及其常用命令

上一篇博客,我们讲解了什么是Redis以及在Windows和Linux环境下安装Redis的方法, 没看过的同学可以点击以下链接查看: Redis系列(一):Redis简介及环境安装. 本篇博客我们来讲解下Redis的5种数据结构及其常用命令,5种数据结构分别为: 字符串String 列表List 集合Set 散列Hash 有序集合ZSet 注意事项:Redis可以存储键(key)值(value)对的映射,其中键(key)一直是String,而值可以是上面提到的5种数据结构中的一种. 1. 字符

Redis的5种数据结构及其常用命令

本篇博客我们来讲解下Redis的5种数据结构及其常用命令,5种数据结构分别为: 字符串String 列表List 集合Set 散列Hash 有序集合ZSet 注意事项:Redis可以存储键(key)值(value)对的映射,其中键(key)一直是String,而值可以是上面提到的5种数据结构中的一种. 1. 字符串String 在Redis中,字符串可以存储以下3种类型的值: 字节串(byte string) 整数 浮点数 经常使用的字符串命令主要分为以下3种类型: 常用命令 自增自减命令 子串

Redis中Key相关的常用指令详解

Redis是一个开源的使用ANSI C 语言编写.支持网络.同memcache相比在Redis下可以实现基于内存亦可持久化的日志型.Key-Value 类型的NoSQL数据库,且在Redis中Key的类型也更为丰富.所以较为广泛的在生产环境中使用,在这里就说一说Redis中Key相关的常用指令. 首先,先要说明下在Redis下Key,Redis的key是字符串类型,但是key 中不能包括边界字符(""),由于key 不是binary safe的字符串,所以像"my key&q

linux中vim编辑器各种常用命令及用法

linux中vim编辑器的常用命令以及用法(注意严格区分大小写以及中英文): vim编辑器有三种模式,分别是:编辑模式,输入模式以及末行模式. 模式转换: 编辑模式>>>输入模式: i:在光标所在字符前面,转为输入模式(即转完后在光标所在字符前输入):                      I:在光标所在行的行首,转为输入模式(即转完后在行首输入,不包括行首空                         白) a:在光标所在字符后,转为输入模式(即转完后在光标所在字符后面输入):

辛星浅析Redis中与key有关的命令

在Redis中,我们还可以直接对key直接操作,下面是我们常用的主要命令: (1)keypattern   它表示获取所有匹配pattern的keys,这里需要注意的是,我们应该避免使用该命令,因为对于大型数据库而言,该命令非常耗时,对Redis服务器的性能打击也是比较大的.它支持glob-style的通配符格式,比如用*表示任意一个或者多个字符,用?表示任意字符,用[xyz]表示方括号中的任意一个字母. (2)del   key ....   它是从数据库中删除参数中指定的keys,如果指定的

Redis中的数据结构

1. 底层数据结构, 与Redis Value Type之间的关系 对于Redis的使用者来说, Redis作为Key-Value型的内存数据库, 其Value有多种类型. String Hash List Set ZSet 这些Value的类型, 只是"Redis的用户认为的, Value存储数据的方式". 而在具体实现上, 各个Type的Value到底如何存储, 这对于Redis的使用者来说是不公开的. 举个粟子: 使用下面的命令创建一个Key-Value $ SET "

redis中各种数据类型的常用操作方法汇总

一.Redis的五大数据类型 1.String(字符串) string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value.string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象 .string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M 2.Hash(哈希,类似java里的Map) Redis hash 是一个键值对集合.Redis hash是一个s

redis中与key相关的命令

1.简单描述 redis本质上是一个key-value db,value可以有多种类型(string.hash.set.sorted set.list等),本章节不讲这些类型的命令,这里是讲跟key相关的命令操作. key本身是string类型,不支持边界符,比如my key 这种名字是会报错的,mykey\n这样包含换行符的也不行,包含\r\n的会被特殊处理,暂不细说. 由于redis的数据是在内存中的,所以如果key的名字过长,会占用更多字节,另外就是查找的时候,会比长度短的key慢.但是k