Redis实战-初识Redis

初识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
相关推荐
TechNomad10 分钟前
Qt开发:QSqlDatabase的常见用法
数据库·qt
老马啸西风11 分钟前
数据库高可用方案-04-删除策略
数据库·oracle
ekskef_sef1 小时前
Nginx—Rewrite
java·数据库·nginx
道剑剑非道1 小时前
QT开发技术 【基于TinyXml2的对类进行序列化和反序列化】 二
java·数据库·qt
明月看潮生2 小时前
青少年编程与数学 02-007 PostgreSQL数据库应用 09课题、规则、约束和默认值
数据库·青少年编程·postgresql·编程与数学
Hurry62 小时前
Mysql 主从复制原理及其工作过程,配置一主两从实验
数据库·mysql
卜及中2 小时前
【Tortoise-ORM】 高级特性与实战
jvm·数据库·oracle·webstorm
早知道不学Java了2 小时前
【达梦数据库(Oracle模式)】如何将视图中的数据导出
数据库·oracle
胖头鱼的鱼缸(尹海文)2 小时前
数据库管理-第285期 Oracle 23ai:深入浅出向量索引(20250117)
数据库·oracle