Redis
Redis简介
Redis是一个开源可以使用的ANSI(美国国家标准协会) C语言编写,遵守BSD(自由软件(就是用户可以自己自由使用并改进的软件)最广泛使用的许可协议)协议、支持网络、可基于内存、分布式、可选持久性的键值对存储数据库,并提供多种语言的API。
Redis被称为数据结构服务器,因为值可以是字符串、哈希、列表、集合、和有序集合等类型
Redis常用于缓存、消息队列、会话存储
Redis基本数据类型
-
String:字符串(set 名字 值)(get 名字)
-
Hash:散列 (hmset 名字 field1 值 field2 值)(hget 名字 值)
-
List:列表(lpush 名字 值 )(lrange 名字 键到键 例如0 10)
-
Set:集合(sadd 名字 值 )(smembers 名字)
-
Sorted Set:有序集合(zadd 名字 键 值 )(ZRANGEBYSCORE 名字 键到键)
-
位图(Bitmaps):基于字符串,可以对每个位进行操作
-
超日志(HyperLogLogs):用于基数统计,可以估算集合中的唯一元素量
-
地理空间(Geospatial):用于存储地理位置信息
-
发布/订阅(Pub/Sub):一种消息通信模式,允许客户端订阅消息通道,并接收发布到该通道的消息
-
流(Streams):用于消息队列和日志存储,支持消息的持久化和时间排序
-
模块(Modules):Redis支持动态加载模块,可以扩展Redis的功能
Redis的优点
-
性能极高:Redis支持每秒数十万次的读写操作,Redis是处理高并发的理想选择。
-
丰富的结构数据:使得开发者有灵活的数据操作能力,可以适应各种场景
-
原子性操作:就是Redis中所有操作都是原子性的,要么全部执行,要么全部不执行。着对于数据一致性和完整性很重要。
-
持久化:Redis支持数据的持久化,内存中的数据可以保存到磁盘中,系统重启之后可以恢复数据,这为Redis提供了安全性。
-
支持发布/订阅模式:Redis支持发布/订阅模式(Pub/Sub这是消息传递的规范)允许客户端可以互相通信
-
单线程模型:Redis通过高效的事件驱动模型来处理并发请求,确保高性能和低延迟。简化并发控制的复杂性
-
主从复制:可通过节点来备份数据或分担请求,提高数据的可用性(系统能够在给定的时间里访问和处理数据的能力)与伸缩性(系统能够在不影响性能的情况下,根据需求增加或者减少资源的能力)
-
跨平台兼容性:可以在多个操作系统上运行,包括 Linux、macOS 和 Windows,这使得它能够在不同的技术栈中灵活部署。
Redis配置
-
port 6379:监听端口,默认端口
-
bind 127.0.0.1:绑定的主机地址
-
timeout 300 :客服端闲置多少秒关闭连接
-
loglevel notice:指定日志级别,redis有四个日志级别:debug、verbose、notice、warning,默认为notice
-
databases 16:设置数据库的数量,默认为0
-
rdbcompression yes:指定存储本地数据库时压缩数据,默认yes
-
dbfilename dump.rdb:指定本地数据库文件名,默认为dump.rdb
-
dir ./:指定本地数据库存放目录
Redis事务
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
-
批量操作在发送 EXEC 命令前被放入队列缓存。
-
收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
-
在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
-
开始事务。
-
命令入队。
-
执行事务。
-
DISCARD 取消事务,放弃执行事务块内的所有命令。
-
EXEC 执行所有事务块内的命令。
-
MULTI 标记一个事务块的开始。
-
UNWATCH 取消 WATCH 命令对所有 key 的监视。
-
[WATCH key key ...] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
Redis脚本
Redis脚本使用lua脚本来执行脚本
lua是一种轻量级的它设计简洁,易于嵌入到其他应用程序中,因此常被用作嵌入式脚本语言。Lua 非常适合游戏开发、应用程序脚本化和扩展,同时也被广泛用于其他领域,包括 Redis 这样的数据库系统中。
在 Redis 中,Lua 脚本用于执行复杂的操作,这些操作可能需要多个 Redis 命令,并且需要保证这些命令的原子性执行。通过 Lua 脚本,可以在 Redis 服务器端一次性执行多个命令,而无需与 Redis 服务器进行多次网络交互,这样可以减少延迟并提高性能。
Redis 提供了以下几个命令来执行 Lua 脚本:
-
EVAL script numkeys key [key ...] arg [arg ...]
:执行一个 Lua 脚本。 -
EVALSHA sha1 numkeys key [key ...] arg [arg ...]
:执行一个缓存在服务器端的 Lua 脚本。 -
SCRIPT LOAD script
:将脚本加载到服务器端的脚本缓存中,但不执行它。 -
SCRIPT EXISTS sha1 [sha1 ...]
:检查指定的脚本是否存在于脚本缓存中。 -
SCRIPT FLUSH
:清除所有缓存在服务器端的 Lua 脚本。 -
SCRIPT KILL
:杀死当前正在执行的 Lua 脚本。 -
实例: redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
Redis GEO地理
Redis GEO 操作方法有:
-
geoadd:添加地理位置的坐标。
-
geopos:获取地理位置的坐标。
-
geodist:计算两个位置之间的距离。
-
georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
-
georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
-
geohash:返回一个或多个位置对象的 geohash 值。
实例 存:
GEOADD cities 112.550864 37.890277 "Taiyuan"
-
GEOADD
:Redis 命令,用于添加地理位置信息。 -
cities
:键名,表示这些地理位置信息将被存储在名为 “cities” 的键中。 -
112.550864 37.890277 "Taiyuan"
:表示城市 “Taiyuan”(太原)的经度为 112.550864,纬度为 37.890277。
实例 取:
GEOPOS cities Taiyuan
-
GEOPOS
:Redis 命令,用于获取地理位置信息。 -
cities
:键名,表示要从名为 “cities” 的键中获取地理位置信息。 -
Taiyuan
:要获取位置的成员名。
Redis Stream
Redis Stream 主要用于消息队列(MQ,Message Queue)对于发布订阅来说流可以持久化操作,历史数据访问、多个消费者等。
Stream特性
-
消息顺序性:消息按插入顺序存储,保证顺序性。
-
消息 ID:每个消息都有一个唯一的 ID,由 Redis 自动生成,格式为
timestamp-ms-sequence-number
。 -
消费者组:Stream 支持消费者组,允许多个消费者从同一 Stream 读取数据,而不会相互干扰。
-
历史数据访问:可以访问 Stream 中的任何历史消息,不像某些消息队列只能处理最新消息。
-
持久化:Stream 数据可以持久化,避免数据丢失。
-
数据大小限制:可以通过配置来限制 Stream 的大小,旧消息会被自动清理。
操作命令:
-
XADD
:添加消息到 Stream -
mystream名字 *自动生成的id表示 name Sara age 32 添加的字段和值
-
MAXLEN 1000 表示消息最多为1000
-
age 32 年龄32
XADD mystream * name Sara age 32 # 自动生成消息 ID XADD mystream MAXLEN 1000 * name Peter age 30 # 自动生成消息 ID,并限制 Stream 长度
-
XREAD
:从 Stream 读取消息。 -
BLOCK 1000 阻塞时间为1000毫秒,如果没有新的消息到来,命令会等待直到超时
-
STREAMS mystream 0-0 指定从 mystream这个 Stream 读取消息,
0-0
表示从最小的消息 ID 开始读取。
XREAD BLOCK 1000 STREAMS mystream 0-0 # 从头开始读取,阻塞 1000 毫秒
-
XREADGROUP
:用于消费者组中的消费者读取消息。 -
CREATE mystream mygroup :指定消费组mygroup 和消费者名称mystream
-
COUNT 1:指定读取消息数量
-
STREAMS mystream :指定从
mystream
这个 Stream 读取消息,>
表示从消费者组未处理的消息开始读取。
XREADGROUP GROUP mygroup myconsumer COUNT 1 STREAMS mystream > # 读取消费者组 mygroup 中的未交付消息
-
XGROUP CREATE
:创建消费者组。 -
mystream:stream的名称
-
mygroup:消费者组的名称。
-
$:指定消费者组从 Stream 的最后一个消息开始消费,也可以指定具体的消息 ID
-
MKSTREAM:如果 Stream 不存在,则创建一个新的 Stream
XGROUP CREATE mystream mygroup $ MKSTREAM # 创建消费者组,MKSTREAM 选项会在 Stream 不存在时创建它
-
XLEN
:获取 Stream 中的消息数量。 -
XLEN
命令用于获取 Stream 中的消息数量
XLEN mystream # 获取 mystream 中的消息数量
-
XRANGE
:获取指定范围内的消息。 -
减号加号:表示消息 ID 的范围,
-
表示最小的消息 ID,+
表示最大的消息 ID
XRANGE mystream - + # 获取 mystream 中的所有消息 XRANGE mystream 1579587858253-0 1579587858253-0 # 获取指定 ID 的消息
-
XDEL
:删除 Stream 中的消息。 -
1579587858253-0
:要删除的消息的 ID
XDEL mystream 1579587858253-0 # 删除指定 ID 的消息
Redis安全
可以通过配置文件来设置密码,这样客服端连接redis服务的时候就需要密码验证。
查看密码
CONFIG get requirepass
设置密码
CONFIG set requirepass “要设置的密码”