初识Redis
- 1、Redis简介
- [2、 Redis数据结构简介](#2、 Redis数据结构简介)
- [3、 Redis命令](#3、 Redis命令)
-
- [3.1 字符串](#3.1 字符串)
- [3.2 列表](#3.2 列表)
- [3.3 集合](#3.3 集合)
- [3.4 散列](#3.4 散列)
- [3.5 有序集合](#3.5 有序集合)
- [3.6 发布与订阅](#3.6 发布与订阅)
- [3.7 其他命令](#3.7 其他命令)
-
- [3.7.1 排序](#3.7.1 排序)
- [3.7.2 过期时间](#3.7.2 过期时间)
如有侵权,请联系~
如有错误,也欢迎批评指正~
本篇文章大部分是来自学习《Redis实战》的笔记
1、Redis简介
Redis 是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生 的 独 一无 二的 数 据 模 型 。 Redis 提供了5种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上:Redis 的数据结构致力于帮助用户解决问题,而不会像其他数据库那 样,要求用户扭曲问题来适应数据库。除此之外,通过复制、持久化(persistence )和客户端分 片(client -side sharding )等特性,用户可以很方便地将Redis 扩展成一个能够包含数百GB 数据、 每秒处理上百万次请求的系统。
需求是否使用redis或者是redis作为主存储还是二级存储取决于程序对性能的要求以及成本问题。
存储 | 类型 | 描述 |
---|---|---|
Redis | 内存存储的非关系型数据库 | 支持五种数据结构:字符串、列表、集合、散列、有序集合; 支持持久化;可以不必像MySQL随机读写、写入临时表,不需要查询分析器、优化器进行处理 |
memcached | 内存存储的键值缓存 | 只支持字符串;不支持持久化;用户只能用APPEND命令将数据添加到已有字符串的末尾,采用的办法是通过黑名单(blacklist)来隐藏列表里面的元素,从而避免对元素执行读取、更新、写入 |
MySQL | 关系型数据库 | 支持ACID事务;存在查询分析器、查询优化器; |
2、 Redis数据结构简介
Redis客户端与服务端交互图【以java为例子】:
这里只是简单的介绍一下数据结构,以及部分命令:
Redis数据结构 | |||
---|---|---|---|
数据结构 | 命令 | 行为描述 | 示例 |
字符串 | GET | 获取存储在给定键中的值 | get key |
字符串 | SET | 设置存储在给定键中的值 | set key value |
字符串 | DEL | 删除存储在给定键中的值 | del key |
列表 | LPUSH | 将给定的值推入列表的左端 | lpush key value |
列表 | RPUSH | 将给定的值推入列表的右端 | rpush key value |
列表 | LPOP | 从列表的左端弹出一个值,并返回被弹出的值 | lpop key |
列表 | RPOP | 从列表的右端弹出一个值,并返回被弹出的值 | rpop key |
列表 | LINDEX | 获取列表上给定位置的单个元素 | lindex key 1 |
列表 | LRANGE | 获取列表上在给定范围上的所有值 | lrange key 0 3 |
集合 | SADD | 将给定的元素添加到集合 | sadd key value |
集合 | SMEMBERS | 返回集合中所有的元素 | smembers key |
集合 | SISMEMBER | 检查给定元素是否存在于集合 | sismember key value |
集合 | SREM | 如果集合中存在该元素,则移除该元素 | srem key value |
散列 | HSET | 在散列里面关联给定的键值对 | hset key key1 value1 |
散列 | HGET | 获取指定的散列的值 | hget key key1 |
散列 | HGETALL | 获取散列中包含的所有键值对 | hgetall key |
散列 | HDEL | 如果给定键存在于散列中,那么移除这个键 | hdel key key1 |
有序集合 | ZADD | 将一个带有给定分值的成员添加到有序集合中 | zadd key 123 value |
有序集合 | ZRANGE | 从有序集合中获取指定位置范围的数据 | zrange key 1 3 |
有序集合 | ZRANGEBYSCORE | 获取有序集合在给定分值范围内的所有元素 | zrangebyscore key 0 800 |
有序集合 | ZREM | 如果给定成员存在于有序集合,那么移除这个成员 | zrem key value |
3、 Redis命令
这里的命令不再包含上述简单的命令。
3.1 字符串
Redis的字符串是一个由字节组成的序列,字符串可以存储三种类型的值:字节串、整数【在64位系统上就是64位有符号整数,32位系统就是32位有符号整数】、浮点数【取值范围和double相同】。
字符串 | |||
---|---|---|---|
命令 | 行为描述 | 示例 | 注释 |
INCR | 将给定键中的值加1 | incr key | 1.当用户将一个值存储到Redis的时候,如果这个值可以被解释为整数或者浮点数,那么Redis允许用户对这个字符串执行各种incr*和decr*操作; 2.如果这个值不可以被解释为整数或者浮点数,执行自增或者自减操作,Redis会返回一个错误; 3.如果执行自增或者自减操作的时候,键值对不存在或者是值为空串,Redis会当做值为0进行处理 |
DECR | 将给定键中的值减1 | decr key | 1.当用户将一个值存储到Redis的时候,如果这个值可以被解释为整数或者浮点数,那么Redis允许用户对这个字符串执行各种incr*和decr*操作; 2.如果这个值不可以被解释为整数或者浮点数,执行自增或者自减操作,Redis会返回一个错误; 3.如果执行自增或者自减操作的时候,键值对不存在或者是值为空串,Redis会当做值为0进行处理 |
INCRBY | 将给定键中的值加上整数 | incrby key amount | 1.当用户将一个值存储到Redis的时候,如果这个值可以被解释为整数或者浮点数,那么Redis允许用户对这个字符串执行各种incr*和decr*操作; 2.如果这个值不可以被解释为整数或者浮点数,执行自增或者自减操作,Redis会返回一个错误; 3.如果执行自增或者自减操作的时候,键值对不存在或者是值为空串,Redis会当做值为0进行处理 |
DECRBY | 将给定键中的值减去整数 | decrby key amount | 1.当用户将一个值存储到Redis的时候,如果这个值可以被解释为整数或者浮点数,那么Redis允许用户对这个字符串执行各种incr*和decr*操作; 2.如果这个值不可以被解释为整数或者浮点数,执行自增或者自减操作,Redis会返回一个错误; 3.如果执行自增或者自减操作的时候,键值对不存在或者是值为空串,Redis会当做值为0进行处理 |
INCRBYFLOAT | 将给定键中的值加上浮点数 | incrbyfloat key amount | 1.当用户将一个值存储到Redis的时候,如果这个值可以被解释为整数或者浮点数,那么Redis允许用户对这个字符串执行各种incr*和decr*操作; 2.如果这个值不可以被解释为整数或者浮点数,执行自增或者自减操作,Redis会返回一个错误; 3.如果执行自增或者自减操作的时候,键值对不存在或者是值为空串,Redis会当做值为0进行处理 |
APPEND | 将值value追加到给定键对应的值的末尾 | append key value | 1、在执行setrange或者setbit命令对字符串进行写入的时候,如果字符串长度不够,那么Redis会自动使用空字节(null)将字符串扩展至所需的长度,然后再执行写入或者更新操作; 2、在使用getrange读取字符串的时候,超过字符串的长度那部分视为空串; 3、在使用getbit读取二进制串的时候,超过字符串长度为0 |
GETRANGE | 获取给定键值从偏移量start到end的字串,包括start和end在内 | getrange key start end | 1、在执行setrange或者setbit命令对字符串进行写入的时候,如果字符串长度不够,那么Redis会自动使用空字节(null)将字符串扩展至所需的长度,然后再执行写入或者更新操作; 2、在使用getrange读取字符串的时候,超过字符串的长度那部分视为空串; 3、在使用getbit读取二进制串的时候,超过字符串长度为0 |
SETRANGE | 给定键值从偏移量offset开始的位置到offset+len(value)的位置被指定的字符串覆盖 | setrange key offset value | 1、在执行setrange或者setbit命令对字符串进行写入的时候,如果字符串长度不够,那么Redis会自动使用空字节(null)将字符串扩展至所需的长度,然后再执行写入或者更新操作; 2、在使用getrange读取字符串的时候,超过字符串的长度那部分视为空串; 3、在使用getbit读取二进制串的时候,超过字符串长度为0 |
GETBIT | 返回二进制串指定位置的二进制值 | getbit key offset | 这其实就是位图bitmap。位图是基于字符串类型的一种特殊应用,将一个字符串视为一系列的二进制位。 |
SETBIT | 设置二进制串指定位置的二进制值为value(0或者1) | setbit key offset value | 这其实就是位图bitmap。位图是基于字符串类型的一种特殊应用,将一个字符串视为一系列的二进制位。 |
BITCOUNT | 统计二进制串中二进制值为1的数量,如果给定了start和end偏移量,那么只统计偏移量范围内的二进制位 | bitcount key [start end] | 这其实就是位图bitmap。位图是基于字符串类型的一种特殊应用,将一个字符串视为一系列的二进制位。 |
BITTOP | 对一个或者多个二进制串执行包括并(AND)、或(OR)、异或(XOR)、非(NOT)按位运算操作,结果存储到dest-key键中 | bittop operation dest-key key1 [key2] | 这其实就是位图bitmap。位图是基于字符串类型的一种特殊应用,将一个字符串视为一系列的二进制位。 |
3.2 列表
列表 | |||
---|---|---|---|
命令 | 行为描述 | 示例 | 注释 |
LTRIM | 对列表进行裁剪,只保留[start, end]范围内的元素 | ltrim key start end | |
BLPOP | 从第一个非空列表中弹出位于最左端的元素或者阻塞timeout秒并等待可弹出的元素 | blpop key1 [key2 ...] timeout | 阻塞弹出和弹出并推入命令最常见的用例就是消息传递和任务队列 |
BRPOP | 从第一个非空列表中弹出位于最右端的元素或者阻塞timeout秒并等待可弹出的元素 | brpop key1 [key2 ...] timeout | 阻塞弹出和弹出并推入命令最常见的用例就是消息传递和任务队列 |
RPOPLPUSH | 从source-key列表中弹出位于最右端的元素,然后将这个元素推入到dest-key列表的最左端,并给用户返回这个元素 | rpoplpush source-key dest-key | 阻塞弹出和弹出并推入命令最常见的用例就是消息传递和任务队列 |
BRPOPLPUSH | 从source-key列表中弹出位于最右端的元素,然后将这个元素推入到dest-key列表的最左端,并给用户返回这个元素;如果source-key中没有元素,那么会阻塞timeout秒等待可弹出元素的出现 | brpoplpush source-key dest-key | 阻塞弹出和弹出并推入命令最常见的用例就是消息传递和任务队列 |
列表的优点:可以包含多个字符串值。
3.3 集合
集合 | ||
---|---|---|
命令 | 行为描述 | 示例 |
SCARD | 返回集合中元素个数 | scard key |
SRANDMEMBER | 从集合中随机的返回一个或者多个元素。当count为正数的时候,命令返回的随机元素不会重复;为负数的时候,返回的随机元素可能重复 | srandmember key [count] |
SPOP | 从集合中随机的移除一个元素,并返回被移除的元素 | spop key |
SMOVE | 如果source-key集合中包含item元素,那么从source-key中移除该元素,并将该元素添加到集合dest-key集合中 | smove source-key dest-key item |
接下来的命令用于处理和组合多个集合 | ||
SDIFF | 返回存在于第一个集合但不存在于其他集合中的元素【差集】 | sdiff key1 [key2 ...] |
SDIFFSTORE | 将存在于第一个集合但不存在于其他集合中的元素【差集】存储到dest-key键里面 | sdiffstore dest-key key1 [key2 ...] |
SINTER | 返回同时存在于所有集合的元素【交集】 | sinter key1 [key2 ...] |
SINTERSTORE | 将同时存在于所有集合的元素【交集】存储到dest-key键里面 | sinterstore dest-key key1 [key2 ...] |
SUNION | 返回所有集合的元素【并集】 | sunion key1 [key2 ...] |
SUNIONSTORE | 将同时存在于所有集合的元素【交集】存储到dest-key键里面 | sunionstore dest-key key1 [key2 ...] |
3.4 散列
散列 | |||
---|---|---|---|
命令 | 行为描述 | 示例 | 注释 |
HMGET | 返回散列中一个或者多个键的值 | hmget key hashkey1 [hashkey2 ..] | |
HMSET | 为散列设置一个或者多个键值对 | hmset key hashkey1 value1 [hashkey2 value2 ..] | |
HDEL | 删除散列中一个或者多个键值对,返回成功删除键值对的个数 | hdel key hashkey1 [hashkey2 ...] | |
HLEN | 返回散列中包含的键值对个数 | hlen key | |
HEXISTS | 返回给定的键是否存在于散列中 | hexists key hashkey | |
HKEYS | 获取散列中包含的所有键 | hkeys key | 尽管有hgetall了,但是hkeys和hvals仍然存在的必要。如果散列包含的值很大,那么用户可以先使用hkeys获取散列包含的所有键,然后分多次获取hget/hmget一个或者多个键值对,避免因为一次获取多个大体积的导致服务端阻塞 |
HVALS | 获取散列中包含的所有值 | hvals key | 尽管有hgetall了,但是hkeys和hvals仍然存在的必要。如果散列包含的值很大,那么用户可以先使用hkeys获取散列包含的所有键,然后分多次获取hget/hmget一个或者多个键值对,避免因为一次获取多个大体积的导致服务端阻塞 |
HGETALL | 获取散列中包含的所有键值对 | hgetall key | 尽管有hgetall了,但是hkeys和hvals仍然存在的必要。如果散列包含的值很大,那么用户可以先使用hkeys获取散列包含的所有键,然后分多次获取hget/hmget一个或者多个键值对,避免因为一次获取多个大体积的导致服务端阻塞 |
HINCRBY | 将键hashkey存储的值增加整数increment | hincrby key hashkey increment | |
HINCRBYFLOAT | 将键hashkey存储的值增加浮点数increment | hincrbyfloat key hashkey increment |
3.5 有序集合
有序集合 | |||
---|---|---|---|
命令 | 行为描述 | 示例 | 注释 |
ZADD | 将带有分值的成员添加到有序集合里面 | zadd key score member [score member ..] | |
ZREM | 从有序集合中删除给定的成员,返回被删除的成员数量 | zrem key member [member ..] | |
ZCARD | 返回有序集合中成员数量 | zcard key | |
ZINCRBY | 给member成员的分值上加上increment | zincrby key increment member | |
ZCOUNT | 返回分值介于[min, max]之间的成员数量 | zcount key min max | |
ZRANK | 返回成员member在有序集合中的排名 | zrank key member | |
ZSCORE | 返回成员member的分值 | zscore key member | |
ZRANGE | 返回有序集合中排名介于[start, stop] 之间的成员,如果带有withscores参数,那么命令会将成员的分值一并返回 | zrange key start stop [withscores] | |
ZREVRANK | 返回成员member在有序集合中的【逆序,分值按照从大到小排序】排名 | zrevrank key member | |
ZREVRANGE | 按照逆序【分值按照从大到小排序】返回有序集合中排名介于[start, stop] 之间的成员,如果带有withscores参数,那么命令会将成员的分值一并返回 | zrevrange key start stop [withscores] | |
ZRANGEBYSCORE | 返回有序集合中分值介于[min,max]之间的成员 | zrangebyscore key min max [withscores] | |
ZREVRANGEBYSCORE | 按照分数值从大到小的顺序返回有序集合中分值介于[min,max]之间的成员 | zrevrangebyscore key min max [withscores] | |
ZREMRANGEBYRANK | 删除有序集合中排名介于[min,max]之间的成员 | zremrangebyrank key min max | |
ZREMRANGEBYSCORE | 删除有序集合中分值介于[min,max]之间的成员 | zremrangebyscore key min max | |
ZINTERSTORE | 用于计算多个有序集合的交集,并将结果存储在新的有序集合中 | zinterstore dest-key numsourcekeys source-key1 source-key2 [WEIGHTS weight [weight ...]] [AGGREGATE sum|min|max] | 对集合求并集或者交集,不只是有序集合,对集合也可以。甚至有序集合和集合一起也可。这里的source-key可以是集合,如果是集合的话,集合中的元素分值默认为1 |
ZUNIONSTORE | 计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination | zunionstore dest-key numsourcekeys source-key1 source-key2 [WEIGHTS weight [weight ...]] [AGGREGATE sum|min|max] | 对集合求并集或者交集,不只是有序集合,对集合也可以。甚至有序集合和集合一起也可。这里的source-key可以是集合,如果是集合的话,集合中的元素分值默认为1 |
3.6 发布与订阅
发布与订阅 | |||
---|---|---|---|
命令 | 行为描述 | 示例 | 注释 |
SUBSCRIBE | 订阅一或多个频道 | subscribe channel [channel] | 发送者往频道发送二进制消息,每当消息发送到频道时,订阅者都会收到消息 |
UNSUBSCRIBE | 退订一或多个频道,如果没有给定频道那么退订所有频道 | unsubscribe [channel [channel]] | 发送者往频道发送二进制消息,每当消息发送到频道时,订阅者都会收到消息 |
PUBLISH | 给指定频道发消息 | publish channel message | 发送者往频道发送二进制消息,每当消息发送到频道时,订阅者都会收到消息 |
PSUBSCRIBE | 订阅与给定模式相匹配的所有频道 | psubscribe pattern [pattern] | 发送者往频道发送二进制消息,每当消息发送到频道时,订阅者都会收到消息 |
PUNSUBSCRIBE | 退订给定模式的频道,如果没有给定模式那么退订所有频道 | punsubscribe [pattern [pattern]] | 发送者往频道发送二进制消息,每当消息发送到频道时,订阅者都会收到消息 |
虽然redis提供了发布和订阅功能,但是一般不建议使用,原因:
- redis的稳定性问题。如果订阅者读取消息的速度不够快的话,消息的不断积压会导致输出缓冲区越来越大,这可能会导致Redis 的速度变慢,甚至直接崩溃。也可能会导致Redis 被操作系统强制杀死,甚至导致操作系统本身不可用。新版的Redis 不会出现这种问题,因为它会自动断开不符合 client-output-buffer-limitpubsub配置选项要求的订阅客户端。
- 和数据传输的可靠性有关。任何网络系统在执行操作时都可能会遇上断线情况, 而断线产生的连接错误通常会使得网络连接两端中的其中一端进行重新连接。 如果客户端在执行订阅操作的过程中断线,那么客户端将丢失在断线期间发送的所有消息。
3.7 其他命令
3.7.1 排序
排序 | |||
---|---|---|---|
命令 | 行为描述 | 示例 | 注释 |
SORT | 对列表、集合以及有序集合进行排序 | sort key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination] | BY pattern可以指定存储到其他key中的值作为比较条件。 参考文献:[Redis的排序命令Sort](https://blog.csdn.net/Tc_lccc/article/details/137624709) |
BY pattern可以指定存储到其他key中的值作为比较条件。 参考文献:[Redis的排序命令Sort](https://blog.csdn.net/Tc_lccc/article/details/137624709) | |||
BY pattern可以指定存储到其他key中的值作为比较条件。 参考文献:[Redis的排序命令Sort](https://blog.csdn.net/Tc_lccc/article/details/137624709) | |||
BY pattern可以指定存储到其他key中的值作为比较条件。 参考文献:[Redis的排序命令Sort](https://blog.csdn.net/Tc_lccc/article/details/137624709) | |||
BY pattern可以指定存储到其他key中的值作为比较条件。 参考文献:[Redis的排序命令Sort](https://blog.csdn.net/Tc_lccc/article/details/137624709) |
3.7.2 过期时间
过期时间 | ||
---|---|---|
命令 | 行为描述 | 示例 |
PERSIST | 移除键的过期时间 | persist key |
TTL | 查看键距离过期还有多少秒 | ttl key |
EXPIRE | 让给定的键在指定秒数后过期 | expire key seconds |
EXPIREAT | 将键的过期时间设置为给定的unix的时间戳 | expireat key timestamp |
PTTL | 查看键距离过期还有多少毫秒 | pttl key |
EXPIRE | 让给定的键在指定毫秒数后过期 | expire key seconds |
EXPIREAT | 将键的过期时间设置为给定的unix的时间戳【毫秒精度】 | expireat key timestamp |