Redis 安装与使用

NoSQL

1. 定义

NoSQL(Not Only SQL)即不仅仅是 SQL,泛指非关系型的数据库

2. 为什么使用 NoSQL?

传统关系数据库在应付动态网站、特别是超大规模和高并发的纯动态网站已经显得力不从心了,如商品网站中对商品数据的频繁查询、热搜商品的排行统计、订单超时问题。虽然能实现功能,但性能不乐观,而且实现异常复杂,nosql 的出现更好地解决了这些问题

3. 分类

键值存储数据库:

  • 说明:主要使用哈希表,这个表有一个特定的键和一个指针指向特定的数据
  • 特点:简单易部署,海量数据下对其中部分值进行查询或更新时,效率低下
  • 相关产品:Redis、SSDB

列存储数据库:

  • 说明:通常用来应付分布式存储的海量数据
  • 特点:键依然存在,但一个键指向多个列,由路由键决定实际指向哪一个列
  • 相关产品:HBase

文档型数据库:

  • 说明:同第一种键值存储类似,该类型的数据模型是版本化的文档,以特定格式存储,比如 JSON
  • 特点:以文档形式存储,允许嵌套键值,可以存储与表现更复杂的数据,查询效率更高
  • 相关产品:MongoDB

图形数据库:

  • 说明:使用灵活的图形模型,并且能扩展到多个服务器
  • 特点:可以存储灵活的数据模型,比如地图
  • 相关产品:InfoGrid

4. 应用场景

  • 数据缓存:常用于缓存数据库查询结果、接口返回结果,下次查询可直接从缓存获取,提升系统响应速度
  • 消息队列:
    • 异步处理:生产者将消息发送到 Redis 消息队列,由消费者异步处理,避免因同步处理导致的阻塞,提高系统性能
    • 流量削峰:高并发场景中,将用户请求先存入 Redis 消息队列,后端按一定速率从队列获取请求处理,避免瞬间大量请求压垮系统
  • 实时数据统计:利用 Redis 实现计数器,比如实时记录网站访问量、商品销量等等
  • 分布式锁:使用 Redis 实现分布式锁,实现资源互斥访问
  • 数据关系维护:使用 Redis 的集合数据结构实现用户好友关系,话题点赞,话题评论等等

Redis 概述

1. 什么是 Redis?

Redis 是一个开源的基于内存数据存储结构,通常用于数据库,缓存和消息中间件

2. 性能优势

Redis 采用单线程架构,优势如下:

  • 避免多线程的复杂性,降低编程难度,提高稳定性
  • 基于内存存储,避免线程切换开销,数据读写速度更快
  • 基于 I/O 多路复用技术高效处理并发连接,将多个客户端的请求放入队列,使用单线程高效的处理事件,避免多线程下对连接资源的竞争和管理问题
  • 单线程保证命令的顺序执行,避免多线程环境下命令执行顺序混乱导致的数据不一致问题

Redis 的性能瓶颈主要有两个:

  • 内存大小:Redis 数据存储在内存,当数据量过大,内存不够,则需要进行磁盘交换
  • 网络带宽:如果 Redis 与客户端之间或集群节点之间数据传输量过大,低带宽会导致延迟增加

4. windows 环境安装

该项目已经多年未更新了,不过作为学习测试还是足够的,下载 Redis-x64-3.2.100.zip 并解压,进入解压目录

打开 cmd 指令窗口,输入命令

.\redis-server.exe .\redis.windows-service.conf

即可运行 Redis

4. Linux 环境安装

以 Ubuntu 18.04.5 为例,安装方法有三种:

4.1 apt-get 方式安装

安装命令

apt-get install -y redis-server

查看 Redis 状态

service redis-server status

可以看到 Redis 状态是 active(running),正在运行当中

启动、停止、重启命令如下

service redis-server start
service redis-server stop
service redis-server restart

默认配置文件位于 /etc/redis/redis.conf

卸载 Redis 命令如下

apt-get purge --auto-remove redis-server
4.2 源码方式安装

下载源码压缩包并解压

wget https://download.redis.io/releases/redis-7.0.4.tar.gz
tar -zxvf redis-7.0.4.tar.gz

由于 Redis 使用 C 语言编写,所以我们需要先安装 gcc 依赖才能完成编译

apt-get update
apt-get install build-essential

进入解压缩目录执行命令,开始编译

make MALLOC=libc

编译完成后会生成一些可执行文件,执行如下命令进行安装

# 表示安装位置在 /usr/redis
make install PREFIX=/usr/redis

进入 /usr/redis/bin 目录启动 Redis 服务

./redis-server	# 使用默认配置

进入 /usr/redis/bin 目录启动 Redis 客户端

# raw 参数的作用是显示中文
./redis-cli -h localhost -p 6379 --raw

默认 redis 服务器没有开启远程连接,也就是默认拒绝所有远程客户端连接,需要修改配置开启远程连接

vim redis.conf

# 允许一切客户端连接
bind 127.0.0.1 修改为 0.0.0.0

默认安装目录没有任何配置文件,如果需要指定配置文件启动,要在源码目录复制 redis.conf 到安装目录,再执行命令

./redis-server ../redis.conf

加上 & 可让 redis 服务后台启动

redis-server ./redis.conf &

Redis 操作

1. 库(database)

存放数据的一个基本单元,一个库可以存放 key-value 键值对,redis 中每个库都有一个唯一名称,编号从 0 开始,默认库的个数为 16 个,默认使用 0 号库,库与库之间彼此隔离

# 切换库
SELECT 0
# 清除当前库
FLUSHDB
# 清除全部库
FLUSHALL

2. 操作 key

-- DEL 指令
	-- 语法:DEL key [key..]
	-- 作用:删除给定的一个或多个 key。不存在的 key 会被忽略。
	-- 返回值:被删除 key 的数量
--EXISTS 指令
	-- 语法:EXISTS key
	-- 作用:检查给定 key 是否存在
	-- 返回值:设置成功返回 1
-- EXPIRE 指令
	-- 语法:EXPIRE key seconds
	-- 作用:为给定 key 设置过期时间,以秒计,超期自动删除
	-- 返回值:设置成功返回 1
-- KEYS 指令
	-- 语法:KEYS pattern
	-- 作用:查找所有符合给定模式(pattern)的 key
	-- 返回值:符合给定模式的 key 列表
-- MOVE 指令
	-- 语法:MOVE key db
	-- 作用:将当前数据库的 key 移动到给定的数据库 db 当中
	-- 返回值:移动成功返回 1,失败返回 0
-- PEXPIRE 指令
	-- 语法:EXPIRE key milliseconds
	-- 作用:设置 key 的过期时间以毫秒计
	-- 返回值:设置成功返回 1
-- PEXPIREAT 指令
	-- 语法:PEXPIREAT key milliseconds-timestamp
	-- 作用:设置 key 过期时间的时间戳 (unix timestamp) 以毫秒计
	-- 返回值:设置成功返回 1,设置失败或 key 不存在时返回 0
-- TTL 指令
	-- 语法:TTL key
	-- 作用:以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)
	-- 返回值
		-- 当 key 不存在时返回 -2
		-- 当 key 存在但没有设置剩余生存时间时返回 -1
		-- 否则以秒为单位返回 key 的剩余时间
-- PTTL 指令
	-- 语法:PTTL key
	-- 作用:以毫秒为单位返回 key 的剩余的过期时间
	-- 返回值
		-- 当 key 不存在时返回 -2
		-- 当 key 存在但没有设置剩余生存时间时返回 -1
		-- 否则以秒为单位返回 key 的剩余时间
-- RANDOMKEY 指令
	-- 语法:RANDOMKEY
	-- 作用:从当前数据库中随机返回一个 key
	-- 返回值:当数据库不为空时返回一个 key,否则返回 nil
-- RENAME 指令
	-- 语法:RENAME key newkey
	-- 作用:修改 key 的名称为 newkey。当 key 和 newkey 相同或者 key 不存在时,返回一个错误。
				当 newkey 存在时,RENAME 命令将覆盖旧值
	-- 返回值:改名成功提示 OK,失败返回一个错误
-- TYPE 指令
	-- 语法:TYPE key
	-- 作用:返回 key 所存储值得类型
	-- 返回值:
		-- none(key 不存在)
		-- string(字符串)
		-- list(列表)
		-- set(集合)
		-- zset(有序集合)
		-- hash(哈希表)

3. 操作 String

-- SET key value
	-- 设置指定 key 的值
-- GET key
	-- 获取指定 key 的值
-- MSET key value [key value ...]
	-- 同时设置一个或多个 key-value 对
-- MGET key1 [key2..]
	-- 获取所有(一个或多个)给定 key 的值
-- GETSET key value
	-- 将给定 key 的值设为 value ,并返回 key 的旧值
-- STRLEN key
	-- 返回 key 所储存的字符串值的长度
-- APPEND key value
	-- 如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾
-- GETRANGE key start end
	-- 返回 key 中字符串值的子字符
-- SETEX key seconds value
	-- 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)
-- PSETEX key milliseconds value
	-- 这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位
-- SETNX key value
	-- 只有在 key 不存在时设置 key 的值
-- MSETNX key value [key value ...]
	-- 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
-- DECR key
	-- 将 key 中储存的数字值减一
-- DECRBY key decrement
	-- key 所储存的值减去给定的减量值
-- INCR key
	-- 将 key 中储存的数字值增一
-- INCRBY key increment
	-- 将 key 所储存的值加上给定的增量值
-- INCRBYFLOAT key increment
	-- 将 key 所储存的值加上给定的浮点增量值
-- GETBIT key offset
	-- 对 key 所储存的字符串值,获取指定偏移量上的位
-- SETBIT key offset value
	-- 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)
-- SETRANGE key offset value
	-- 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始

4. 操作 List

-- LPUSH key value1 [value2]
	-- 将一个或多个值插入到列表头部
-- LPUSHX key value
	-- 将一个值插入到已存在的列表头部
-- RPUSH key value1 [value2]
	-- 在列表中添加一个或多个值
-- RPUSHX key value
	-- 为已存在的列表添加值
-- LPOP key
	-- 移出并获取列表的第一个元素
-- RPOP key
	-- 移除列表的最后一个元素,返回值为移除的元素
-- LRANGE key start stop
	-- 获取列表指定范围内的元素
-- LLEN key
	-- 获取列表长度
-- LSET key index value
	-- 通过索引设置列表元素的值
-- LINDEX key index
	-- 通过索引获取列表中的元素
-- LREM key count value
	-- 移除列表元素
-- LTRIM
	-- 保留列表特定区间内的元素
-- LINSERT key BEFORE|AFTER pivot value
	-- 在列表的元素前或者后插入元素
-- BLPOP key1 [key2 ] timeout
	-- 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
-- BRPOP key1 [key2 ] timeout
	-- 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
-- BRPOPLPUSH source destination timeout
	-- 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它。如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
-- LTRIM key start stop
	-- 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
-- RPOPLPUSH source destination
	-- 移除列表的最后一个元素,并将该元素添加到另一个列表并返回

5. 操作 Set

1   SADD key member1 [member2]
向集合添加一个或多个成员
2	SCARD key
获取集合的成员数
3	SDIFF key1 [key2]
返回给定所有集合的差集
4	SDIFFSTORE destination key1 [key2]
返回给定所有集合的差集并存储在 destination 中
5	SINTER key1 [key2]
返回给定所有集合的交集
6	SINTERSTORE destination key1 [key2]
返回给定所有集合的交集并存储在 destination 中
7	SISMEMBER key member
判断 member 元素是否是集合 key 的成员
8	SMEMBERS key
返回集合中的所有成员
9	SMOVE source destination member
将 member 元素从 source 集合移动到 destination 集合
10	SPOP key
移除并返回集合中的一个随机元素
11	SRANDMEMBER key [count]
返回集合中一个或多个随机数
12	SREM key member1 [member2]
移除集合中一个或多个成员
13	SUNION key1 [key2]
返回所有给定集合的并集
14	SUNIONSTORE destination key1 [key2]
所有给定集合的并集存储在 destination 集合中
15	SSCAN key cursor [MATCH pattern] [COUNT count]
迭代集合中的元素

6. 操作 ZSet

元素可排序,不可以重复

1	ZADD key score1 member1 [score2 member2]
向有序集合添加一个或多个成员,或者更新已存在成员的分数
2	ZCARD key
获取有序集合的成员数
3	ZCOUNT key min max
计算在有序集合中指定区间分数的成员数
4	ZINCRBY key increment member
有序集合中对指定成员的分数加上增量 increment
5	ZINTERSTORE destination numkeys key [key ...]
计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
6	ZLEXCOUNT key min max
在有序集合中计算指定字典区间内成员数量
7	ZRANGE key start stop [WITHSCORES]
通过索引区间返回有序集合指定区间内的成员
8	ZRANGEBYLEX key min max [LIMIT offset count]
通过字典区间返回有序集合的成员
9	ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
通过分数返回有序集合指定区间内的成员
10	ZRANK key member
返回有序集合中指定成员的索引
11	ZREM key member [member ...]
移除有序集合中的一个或多个成员
12	ZREMRANGEBYLEX key min max
移除有序集合中给定的字典区间的所有成员
13	ZREMRANGEBYRANK key start stop
移除有序集合中给定的排名区间的所有成员
14	ZREMRANGEBYSCORE key min max
移除有序集合中给定的分数区间的所有成员
15	ZREVRANGE key start stop [WITHSCORES]
返回有序集中指定区间内的成员,通过索引,分数从高到低
16	ZREVRANGEBYSCORE key max min [WITHSCORES]
返回有序集中指定分数区间内的成员,分数从高到低排序
17	ZREVRANK key member
返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
18	ZSCORE key member
返回有序集中,成员的分数值
19	ZUNIONSTORE destination numkeys key [key ...]
计算给定的一个或多个有序集的并集,并存储在新的 key 中
20	ZSCAN key cursor [MATCH pattern] [COUNT count]
迭代有序集合中的元素(包括元素成员和元素分值

7. 操作 Hash

value 是一个 map 结构,无序

1	HDEL key field1 [field2]
删除一个或多个哈希表字段
2	HEXISTS key field
查看哈希表 key 中,指定的字段是否存在。
3	HGET key field
获取存储在哈希表中指定字段的值。
4	HGETALL key
获取在哈希表中指定 key 的所有字段和值
5	HINCRBY key field increment
为哈希表 key 中的指定字段的整数值加上增量 increment
6	HINCRBYFLOAT key field increment
为哈希表 key 中的指定字段的浮点数值加上增量 increment
7	HKEYS key
获取所有哈希表中的字段
8	HLEN key
获取哈希表中字段的数量
9	HMGET key field1 [field2]
获取所有给定字段的值
10	HMSET key field1 value1 [field2 value2 ]
同时将多个 field-value (域-值)对设置到哈希表 key 中
11	HSET key field value
将哈希表 key 中的字段 field 的值设为 value
12	HSETNX key field value
只有在字段 field 不存在时,设置哈希表字段的值
13	HVALS key
获取哈希表中所有值
14	HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的键值对

8. 操作 BitMap

Bitmap 类型是对 Sting 类型的巧妙使用,允许开发者以位级别操作字符串中的数据。Bitmap 可以视为一个巨大的位数组,每个位(bit)可以存储 0 或 1 的值,这使得 Bitmap 非常适合用于存储和操作大量的布尔值或者进行高效的统计计数

SETBIT key offset value:设置位图中指定偏移量的值
GETBIT key offset:获取位图中指定偏移量的值
strlen key:获取该 Bitmap 所占用的字节数,而不是比特位中 1 的个数
BITCOUNT key [start end]:计算位图中位值为 1 的个数,可选地限制在指定范围内
BITOP operation destkey key [key ...]:对多个位图执行 ANDORNOTXOR 操作,并将结果保存到 destkey

9. 操作 HyperLogLog

被用于估计输入元素数量的概率性的数据结构,本身不存储元素,而是根据输入元素按照算法返回可能的统计值,统计存在一定的误差,但误差率较低

HyperLogLog 的优势在于当输入元素的数量或者体积非常大时,其所占的空间总是固定的,并且是很小的。例如我们需要统计一个大型网站的独立访问次数,用 IP 作为独立访问的判断依据,那么我们就要存储每个独立 IP,以 IPv4 为例,其需要 4 个字节来存储,当有一千万个独立 IP 时,所占用的空间就是 4byte * 10000000 约等于 38MB,但这只是一个页面的统计信息,假如我们有 1 万个这样的页面,那就需要约 371GB 以上的空间来存储,这时就不能用集合来存储了,而是使用 HyperLogLog

PFADD key element [element ...]:添加指定元素到 HyperLogLog
PFCOUNT key [key ...]:返回给定 HyperLogLog 的统计值
PFMERGE destkey sourcekey [sourcekey ...]:将多个 HyperLogLog 合并为一个 HyperLogLog

10. 操作 Geospatial

存储地理空间的位置信息和执行地理相关的查询,比如查找指定半径内的所有位置、计算两个位置之间的距离等。Geospatial 数据实际是存储在有序集合(sorted set)中,每个成员的排序值(score)是经过编码的 Geohash 值

将指定的地理空间位置(经度、纬度、成员)添加到 Redis 的键中
key:存储地理空间数据的键
NX:只在成员不存在时添加
XX:只在成员已存在时添加
CH:修改返回被修改的成员数量
longitude:经度
latitude:纬度
member:成员名称
GEOADD key [NX | XX] [CH] longitude latitude member [longitude latitude member ...]
GEOADD china:city 116.40 39.90 beijing

返回一个或多个成员的地理位置
key:存储地理空间数据的键
member:一个或多个成员的名字
GEOPOS key [member [member ...]]
GEOPOS china:city beijing

计算存储在 Redis 地理空间索引中的两个成员之间的距离
key:存储地理空间数据的键
member1:第一个成员的名字
member2:第二个成员的名字
[M|KM|FT |MI]:可选,距离单位,M:米,KM:千米,FT:英尺,MI:英里
GEODIST key member1 member2 [M | KM | FT | MI]
geodist  china:city beijing shanghai

返回一个或多个成员的 Geohash 值,Geohash 是一种地理编码方法,将地理坐标转换为字符串形式,便于存储和比较,如果两个字符串越接近,那么则距离越近
key:存储地理空间数据的键。
member:一个或多个成员的名字
GEOHASH key [member [member ...]]
geohash china:city beijing chongqing

在地理空间索引中搜索符合指定条件的成员
key:存储地理空间数据的键
FROMMEMBER member:指定以哪个成员为中心进行搜索
BYRADIUS radius <M| KM| FT | MI>:根据给定的半径范围进行搜索
BYB0X width height <M| KM| FT | MI>:根据给定的矩形范围进行搜索,矩形的宽度和高度以及单位
ASC | DESC:指定搜索结果的排序顺序
COUNT count [ANY]:指定返回的成员数量,可选参数 ANY 表示返回的成员数量可能比指定数量稍多或稍少
WITHCOORD:返回搜索结果的经度和纬度信息
WITHDIST:返回搜索结果与中心成员的距离信息
WITHHASH:返回搜索结果的 geohash 信息
GEOSEARCH key
  <FROMMEMBER member>
  <BYRADIUS radius <M| KM| FT | MI> | BYBOX width height <M | KM | FT | MI>>
  [ASC | DESC]
  [COUNT count [ANY]]
  [WITHCOORD]
  [WITHDIST]
  [WITHHASH]
返回距离 member 成员不超过 100 千米范围内的成员,并包含这些成员的经纬度和距离信息
GEOSEARCH Key FROMMEMBER member BYRADIUS 100 KM WITHCOORD WITHDIST
返回距 member 成员所在矩形区域大小为 10km * 20km 范围内的至多 5 个成员,并包含这些成员的 geohash 信息
GEOSEARCH key FROMMEMBER member BYBOX 10 20 KM WITHHASH COUNT 5 ANY

GEOSEARCHSTORE 与 GEOSEARCH 类似,在地理空间索引中进行搜索,但不同的是,它将搜索结果存储到一个新的键中,而不是直接返回结果
destination:目标键,用于存储搜索结果
source:源键,包含地理空间数据
FROMMEMBER member:指定以哪个成员为中心进行搜索
FROMLONLAT longitude latitude:使用指定的经纬度作为搜索中心
BYRADIUS radius <M | KM | FT | MI>:根据给定的半径范围进行搜索
BYBOX width height <M| KM | FT | MI>:根据给定的矩形范围进行搜索,矩形的宽度和高度以及单位
ASC | DESC:指定搜索结果的排序顺序
COUNT count [ANY]:指定返回的成员数量,可选参数 ANY 表示返回的成员数量可能比指定数量稍多或稍少
STOREDIST:将成员与中心点的距离也存储到目标键中
GEOSEARCHSTORE destination source
  <FROMMEMBER member | FROMLONLAT longitude latitude>
  <BYRADIUS radius <M| KM | FT | MI> | BYBOX width height <M| KM| FT| MI>>
  [ASC|DESC]
  [COUNT count[ANY]]
  [STOREDIST]
搜索距离 member 成员不超过 100km 范围内的成员,并将结果存储到 destKey
GEOSEARCHSTORE destKey srckey FROMMEMBER member BYRADIUS 100 KM
搜索以经纬度 (13.361389,38.115556) 为中心,矩形区域大小为 10km*20km 范围内的成员,并将结果存储到 destKey
GEOSEARCHSTORE destKey srcKey FROMLONLAT 13.361389 38.115556 BYBOX 10 20 KM
搜索距离 member 成员不超过 50km 范围内的成员,并将结果及其与中心点的距离存储到 destkey
GEOSEARCHSTORE destKey srckey FROMMEMBER member BYRADIUS 50 KM STOREDIST

posted @   低吟不作语  阅读(181)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示