Redis

#Redis #NoSQL #NOTE #DBMS

What is Hash?

哈希 的实质是一个算法。

  • 任意长度的信息(可以是字符串、数据或者任何文件)经过哈希运算后,输出一个固定长度的值,这个值就是哈希值。
  • 哈希运算是一种压缩映射,在哈希计算器中无论输入什么样的数据,最后得到的结果都是一个固定长度的数字/字母混合的随机数列

Common Hash Algorithm

  • MD5
  • SHA-1
  • SHA-256

Hash Application

Hash application
  • Digest(摘要),Checksum(校验值),Fingerprint(指纹)
  • 文件校验
  • 文件传输校验:MD5
  • 保存二进制文件系统数字指纹:MD5
  • 数字签名
  • 鉴权协议
  • 网站注册
  • 区块链和加密货币:SHA-256和RIPEMD160

Key-Value Store

What is Key - Value store?

键值存储是一个简单的哈希表
所有对数据库的访问都是通过主键
通过键值存储可以

  • 获取键值
  • 输入键值
  • 从数据存储中删除一个键值

Features

Key-Value store feature
  • 哈希函使键值数据访问可实现高性能和高可用性
  • 键和值都可以是复杂的复合对象,有时也可以是列表、地图或其他数据结构。
  • 一致性只适用于对单个键的操作(最终一致性)
  • 将所有数据存储在单个数据桶中

Pros and Cons

优点

  • 高效查询(性能非常可预测)。
  • 易于在集群中分配。
  • 面向服务不允许使用外键约束,无论如何都要在代码中完成连接。
  • 使用关系数据库 + 高速缓存,无论如何都要使用键值存储
  • 无对象-关系错配缺点

缺点

  • 没有复杂的查询过滤器
  • 所有连接必须在代码中完成
  • 无外键约束
  • 无触发器

What is Redis?

REmote DIctionary Server(Redis)是一个开源的内存 NoSQL 数据库项目,它实现了一个分布式、内存键值存储,并具有可选的耐用性

该项目主要由 Salvatore Sanfilippo 开发,目前由 Redis Labs 赞助

Feature

  • 读写速度极快
  • 持久、可扩展
  • 直接数据访问

Application Scenario

  • 存储会话信息
  • 用户配置文件、首选项
  • 购物车数据

Unsuitable Scenario

  • 数据之间的关系
  • 多操作事务
  • 按数据查询
  • 按集合操作

Quick Start Only For MacOS

Installation

  • 安装 Redis (此处采用 homebrew 包管理器进行安装)
brew install redis	

Start

  1. MacOS 后台启动 Redis
brew services start redis	
  1. 命令行启动 Redis
redis-cli	

Close

exit		
brew services stop redis

Redis Operation

Operation On Database

  • 选择数据库
Select <index>
Example

选择数据库

  • 查看数据库
Config get databases	
Example

查看数据库

  • 删除数据库
删除单个数据库
FLUSHDB
删除所有数据库
FLUSHALL

Operation On Key

  • Set 将值存储到key对应的内存空间中
Set <key> <value>
  • Get 读取key对应的数据
Get <key>	
  • Del 如果Key存在, 则删除该Key
Del <key>
  • Exists 判断key是否存在
Exists <key>
  • Expire 在指定时间(以秒为单位)后使密钥失效。
Expire <key> <seconds>
  • Move 将当前数据库的key移动到指定的数据库
Move <key> <db>
  • Rename 重命名key
Rename <key> <newkey>	
  • Type 返回key的数据类型
Type <key>

Redis Data structure

  • String
  • List
  • Hash
  • Set
  • ZSet
  • Stream

String

  • 得到从 start 到 end 的字符串
getrange <key> <start> <end>
  • 设置key的值,并返回旧值
getset  <key> <value>
  • 得到多个key的值
mget <key1> <key2> <key3>
  • 设置多个key的值
setrange <key> <offset> <value>
  • 得到字符串的长度
strlen <key>
  • 覆盖从指定位置开始的键字符串部分
setrange <key> <offset> <value>
  • Key +1/-1
incr/decr <key>
  • Key (+value/-value)
incrby/decrby <key> <value>
  • Append value to key
append <key> <value>
  • SetBit:用于设置键值字符串中指定位置的值。
setbit <key> <place> <val>
  • GetBit:用于获取键值字符串中指定位置的值。
getbit <key> <place> <val>
  • BitCount:用于统计键值字符串中二进制位为 1 的数量。
bitcount <key>	

Hash

  • HSET:用于设置哈希字段的值。
hset <key> <field> <value>
  • HMSET: 用于设置多个哈希字段的值。
hmset <key> <field1> <value1> <field2> <value2>
  • HGET:用于获取哈希字段的值。
hget <key> <field>
  • HMGET: 获取所有给定哈希字段的值。
hmget <key> <field1> <field2>
  • HGETALL:获取哈希中指定键的所有字段和值。
hgetall <key>
  • HDEL:删除哈希中的一个或多个字段。
HDEL  <key> <field1> <field2>
  • HEXISTS:查看哈希中是否存在指定字段。
HEXISTS <key> <field>	
  • HLEN: 获取哈希中字段的数量。
HLEN <key>	
  • HKEYS:获取哈希中的所有字段。
HKEYS <key>		
  • HVALS:获取哈希中的所有值。
HVALS <key>	
  • HINCRBY:用于增加哈希中指定字段的值。
HINCRBY <key> <field> <value>
  • HINCRBYFLOAT:用于按给定值递增哈希字段的浮点值。
HINCRBYFLOAT <key> <field> <value>

List

  • LPUSH:将一个或多个值插入到列表的头部。
LPUSH <key> <value1> <value2>
  • RPUSH: 将一个或多个值插入到列表的尾部。
RPUSH <key> <value1> <value2>
  • LPOP:移除并返回列表的第一个元素。
LPOP <key>
  • RPOP:移除并返回列表的最后一个元素。
RPOP <key>
  • LRANGE:获取列表指定范围内的元素。
LRANGE <key> <start> <end>
  • LINDEX:通过索引获取列表中的元素。
LINDEX <key> <index>
  • LLEN:获取列表的长度。
LLEN <key>
  • LTRIM:将列表修剪到指定范围(start end )。
LTRIM <key> <start> <end>
  • LREM: 从键值存储的列表中删除第一个出现的元素值。该操作受 count 影响:
    • 如果 count >0,则移除与从头部移至尾部的值相同的元素的第一个出现次数。
    • 如果 count <0,则删除从尾部移动到头部的值相等的元素的第一个出现次数。
    • 如果 count = 0,则删除所有等于值的元素。
LREM <key> <count> <value>
  • LINSERT:在列表的元素前或后插入元素。
LINSERT <key> <before/after> <pivot> <value>
  • LSET:通过索引设置列表元素的值。
LSET <key> <index> <value>
  • RPOPLPUSH::移除列表的最后一个元素,并将该元素添加到另一个列表并返回。
RPOPLPUSH <source> <destination>

Set

Redis 集合是无序集合
添加、删除和测试成员是否存在的时间为 O(1)
Redis 集合具有不允许重复成员的理想特性。多次添加相同元素将导致集合中只有该元素的一个副本。

  • SADD
    • Set Add 为集合添加一个或多个成员。
SADD <key> <Member1> <Member2>
  • SMEMBERS: 显示集合的所有成员。
SMEMBERS <key> 
  • SCARD: 返回集合中成员的数量。
SCARD <key>
  • SREM: 删除集合中的一个或多个成员
    • Set Remove
SREM <key> <Member1> <Member2>
  • SISMEMBER: 检查给定值是否是集合的成员。如果值是成员,则返回 1,否则返回 0。
    • Set IsMember
SISMEMBER <key> <Member>
  • SPOP: 根据计数从集合中删除并返回一个或多个随机成员。
    • Set Pop
SPOP <key> <num>
  • SRANDMEMBER: 根据计数从集合中获取一个或多个随机成员
    • Set Random Member
SRANDMEMBER <key> <num>
  • SMOVE: 将成员从一个集合移动到另一个集合。
    • Set Move Move from one set to another set
SMOVE <source> <destination> <member>
  • SUNION: 返回多个集合的并集。
    • Set Union
SUNION <set1> <set2>
  • SINTER: 返回多个集合的交集。
    • Set Intersection
SINTER <set1> <set2>
  • SDIFF: 返回多个集合的差值
    • Set Difference
SDIFF <set1> <set2>
  • SUNIONSTORE: 将多个集合的交集存储在一个键中
    • Set Union Store
SUNIONSTORE <newkey> <set1> <set2>
  • SINTESTORE: 将多个集合的交集存储在一个键中
    • Set Intersection Store
SINTESTORE <newkey> <set1> <set2>
  • SDIFFSTORE:
    • Set Difference Store
SDIFFSTORE <newkey> <set1> <set2>

ZSet

Redis 排序集是字符串的非重复集合,与 Redis 集类似。
其中,排序集的每个成员都与一个分数相关联,该分数用于将排序集从小到大排序。
虽然分数可以重复,但成员和集合一样是唯一的。

对排序集进行添加、删除或更新等操作的速度非常快(执行时间与元素数量的对数成正比)。
由于元素是按顺序提取的,而不是事后排序,因此还可以通过得分或排名(位置)快速获取范围。
总之,使用排序集,可以以极佳的性能完成许多任务,而这些任务在其他类型的数据库中很难实现。

  • ZADD: 向排序集添加一个或多个成员,或更新其分数(如果存在)。
    • ZSet Add
ZADD <key> <score1> <member1> <score2> <member2>
  • ZRANGE: 按索引返回排序集合中成员的范围。升序
    • ZSet Range
ZRANGE key start stop [WITHSCORES]
  • ZREVRANGE: 按索引返回排序集合中成员的范围。降序
    • ZSet Reverse Range
ZREVRANGE key start stop [WITHSCORES]
  • ZSCORE: 获取排序集合中给定成员的相关分数
    • ZSet Score
ZSCORE <key> <member>
  • ZRANGEBYSCORE: 返回排序集中成员的范围,其分数介于最小值和最大值之间,升序
    • ZSet Range by Score
ZRANGEBYSCORE <key> <min> <max> [WITHSCORES] [LIMIT count]
  • ZREVRANGEBYSCORE: 返回排序集中成员的范围,其分数介于最小值和最大值之间,降序
ZREVRANGEBYSCORE <key> <max> <min> [WITHSCORES] [LIMIT count]
  • ZCARD: 获取排序集合中的成员数。
    • ZSet Cardinality
ZCARD <key>
  • ZCOUNT: 获取排序集合中分数介于最小值和最大值之间的成员个数。
    • ZSet Count
ZCOUNT <key> min max
  • ZRANK: 返回排序集合中某个成员的索引
    • ZSet Rank
ZRANK <key> <Member>
  • ZREVRANK:返回排序集合中某个成员的索引, 降序
    • ZSet Reverse Rank
ZREVRANK <key> <Member>
  • ZREM: 删除集合中的一个或多个成员
    • ZSet Remove
ZREM <key> <Member1> <Member2>
  • ZREMRANGEBYSCORE: 删除排序集合中分数介于最小值和最大值之间的成员。
    • ZSet Remove Range by Score
ZREMRANGEBYSCORE <key> <min> <max>
  • ZREMRANGEBYRANK: 删除排序集合中给定索引范围内的所有成员。
    • ZSet Remove Range by Rank
ZREMRANGEBYRANK <key> <start> <stop>
  • ZINCRBY: 增加排序集合中成员的得分。
    • ZSet Increment by Score
ZINCRBY <key> <score>
  • ZINTESTORE: 计算两个或多个排序集的交集,并将其存储到目的地。
    • ZSet Intersection Store
ZINTERSTORE <newkey> <set count> <set1> <set2> WEIGHTS [weight1][weight2] [aggregate sum|min|max]
  • ZUNIONSTORE: 计算两个或多个排序集的并集,并将其存储到目的地。
    • ZSet Union Store
ZUNIONSTORE <newkey> <set count> <set1> <set2> WEIGHTS [weight1][weight2] [aggregate sum|min|max]

Publish and Subscribe

Redis 实现了发布/订阅(Publish/Subscribe)消息传递范式,在这种范式中,发送者(发布者)不需要向特定的接收者(订阅者)发送消息。

  • 相反,发布的消息被归类到频道中,而不知道有哪些订阅者。

  • 订阅者对一个或多个频道表示兴趣,只接收感兴趣的信息,而不知道有哪些发布者。

这样可以实现更高的可扩展性和更动态的网络拓扑结构。

一旦进入订阅模式,Redis-cli 将不接受任何命令,除非使用 Ctrl+C 退出该模式。

Subscribe

  • SUBSCRIBE: 监听发布到指定频道的信息。
SUBSCRIBE [Chanel1] [Chanel2] [Chanel3]
  • PSUBSCRIBE : 订阅与给定模式匹配的频道。
PSUBSCRIBE pattern1 [pattern2]
  • 例如:订阅所有 带News 的频道。
PSUBSCRIBE *News
  • UNSUBSCRIBE: 从指定频道取消订阅客户端,如果没有指定频道,则从所有频道取消订阅。
UNSUBSCRIBE [Chanel1] [Chanel2] [Chanel3]

  • PUNSUBSCRIBE:从符合给定模式的频道中取消订阅客户端。
PUNSUBSCRIBE pattern1 [pattern2] (取消订阅模式)
  • 在 Redis 中,当客户端在命令行下工作时,处于订阅状态的客户端不接受任何命令,因此按下 Ctrl-C 时会自动取消订阅所有通道。

Publish

向频道发布消息。

PUBLISH <channel> <message>

Transactions in Redis

Redis 事务允许在一个步骤中执行一组命令。
事务中的所有命令都被序列化并按顺序执行。
在执行 Redis 事务的过程中,绝不会出现其他客户端发出的请求被送达的情况。
这就保证了命令是作为一个单独的操作执行的。

要么处理所有命令,要么不处理任何命令,因此 Redis 事务也是原子性的。
EXEC 命令会触发事务中所有命令的执行。
如果客户端在调用 MULTI 命令之前,在事务上下文中失去了与服务器的连接,则不会执行任何操作。相反,如果调用 EXEC 命令,则会执行所有操作。

MULTI: 标记一个事务块的开始。

MULTI 
SET Name Mark
SET Age 25	
INCRBY Age 5
GET *

EXEC: 执行所有事务块内的命令。

EXEC

Redis Configuration

  • Redis.conf 是 Redis 配置文件,可用于配置 Redis 的各个方面。

  • Redis 的每个版本都有一个文档详尽的 redis.conf 文件。

  • 示例文件包含默认配置选项,有助于了解这些设置的作用和默认值。

  • config set 命令可用于设置配置文件中的各个值。

config set CONFIG_SETTING_NAME
  • config get 命令用于显示某个设置的值。
config get CONFIG_SETTING_NAME
  • 可以使用以下命令查看 Redis.conf 中的所有可用设置:
config get *