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结构:
其中:
SET和ZSET中没有重复元素;
相比SET,ZSET具有排序功能;
ZSET和HASH的value也是键值对形式:ZSET(score,member)、HASH(field,value);
STRING类型中不仅仅是存储字符,也可以存储数值(整数、浮点数);
5种数据结构最终存储的数据类型实际只有两种:字符和数值,Redis能够区分存储的值是字符还是数字;
Redis中常用命令
在redis-cli中对于输入的命令会有智能提示
| 命令 | 作用 |
|---|---|
| HELP | 获取命令的帮助信息,学会help命令很重要 |
| DEL | 删除key及对应的值 |
| EXPIRE | 设置键的过期时间,过期的键连同与该键相关的数据都将被删除 |
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命令,专门写了一段程序进行验证,效果图如下:

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值的处理分为三种方式:
- 求和
- 取最大值
- 取最小值
执行ZINTERSTORE命令:
- 参数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中的keyRedisValue
存储到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
参考文章
Redis中的数据结构与常用命令的更多相关文章
- Redis系列(二):Redis的5种数据结构及其常用命令
上一篇博客,我们讲解了什么是Redis以及在Windows和Linux环境下安装Redis的方法, 没看过的同学可以点击以下链接查看: Redis系列(一):Redis简介及环境安装. 本篇博客我们来 ...
- Redis启动服务和String常用命令
Redis启动服务和String常用命令 1. 启动Redis服务 E:\redis>redis-server.exe redis.windows.conf _._ _.-``__ ''-._ ...
- Redis中的原子操作(2)-redis中使用Lua脚本保证命令原子性
Redis 如何应对并发访问 使用 Lua 脚本 Redis 中如何使用 Lua 脚本 EVAL EVALSHA SCRIPT 命令 SCRIPT LOAD SCRIPT EXISTS SCRIPT ...
- Redis中LIST列表的相关命令
Redis中LIST列表的相关命令 添加 lpush 将一个或多个value插入到key的表头,如果存在多个value,那么各个value按从左到右的顺序依次插入表头 插入表头:意味着新插入的值在最前 ...
- Linux 系统中如何查看日志 (常用命令) tail -f
Linux 系统中如何查看日志 (常用命令) tail -f 日志文件 日 志 文 件 说 明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日 ...
- redis 五大数据结构__常用命令
linux 下下载redis数据库 apt install redis 如果提示权限不够的话, 直接提权: sudo apt install redis-server linux启用.停止服务 ser ...
- redis数据结构和常用命令
redis常用数据结构 String 最简单的K_V,value可以是数字或者字符串,使用场景:微博数.普通计数,命令:get set incr(加1) decr(减1) mget(获取多个值),se ...
- redis五种数据类型和常用命令及适用场景
一.redis的5种数据类型: 1.基础理解: string 字符串(可以为整形.浮点型和字符串,统称为元素) list 列表(实现队列,元素不唯一,先入先出原则) set 集合(各不相同的元素) h ...
- Redis入门,Jedis和常用命令
一.Redis简介 1.关于关系型数据库和nosql数据库 关系型数据库是基于关系表的数据库,最终会将数据持久化到磁盘上,而nosql数据 库是基于特殊的结构,并将数据存储到内存的数据库.从性 ...
随机推荐
- 微信和支付宝支付模式详解及实现(.Net标准库)- OSS开源系列
支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至和业务系统高度耦合,网上也存在各种解决方案,但大多形式各异,东拼西凑而成. ...
- Android -- Android下的NDK开发(一)
1,NDK是什么?为什么要进行NDK开发? NDK:Native Development Kit.Android应用运行在Dalvik虚拟机中.NDK允许开发人员使用本地代码语言(例如C和C++)实现 ...
- bzoj4810 [Ynoi2017]由乃的玉米田
Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐. 由乃认为玉米田不美,所以她决定出个数据结构题 这个题是这样的: 给你一 ...
- 通过 bootloader 向其传输启动参数
作者:Younger Liu, 本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. Linux提供了一种通过bootloader向其传输启动参数的功能,内核开发 ...
- Python中使用Mysql(安装篇)
准备工作 import MySQLdb Linux系统自带了Python,但并不是都有这个包,至少我每次拿到一台全新的服务器时候,都发现没有装这个包. 这个东西的下载地址是 http://source ...
- cmd 命令行模式操作数据库 添加查询 修改 删除 ( 表 字段 数据)
一 查看数据库.表.数据字段.数据 1 首先配置环境变量 进入mysql 或者通过一键集成工具 打开mysql命令行 或者mysql 可视化工具 打开命令行 进入这样的界面 不同的机器操作不同 ...
- Vue 项目实战系列 (二)
上一章节我们已经把项目的初始化工作完成了,接下来我们再来进行具体的代码编写.这一节我们将完成如下的页面. 我们在src/目录下新建一个views文件夹,存放我们的主要页面文件.目录结构如下: cine ...
- spark2.0系列《一》—— RDD VS. DataFrame VS. DataSet
虽说,spark我也不陌生,之前一直用python跑的spark,基本的core和SQL操作用的也是比较熟练.但是这一切的基础都是在RDD上进行操作,即使是进行SQL操作也是将利用SpaekConte ...
- 从foreach语句枚举元素看数组
在foreach语句中使用枚举,可以迭代数组或集合中的元素,且无须知道集合中的元素的个数.如图显示了调用foreach方法的客户端和集合之间的关系.数组或集合实现带GetEnumerator()方法的 ...
- ObjectARX自定义实体的最近点和垂点捕捉算法
最近点用pickPoint来计算,垂点用lastPoint计算. 一般AcDbCurve类可以用AcGe类的 getClosestPointTo 来实现计算需要的点值. 下面是代码示例: case A ...