0%

Redis入门篇

Redis简介

Redis: The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker.

Redis是被数百万开发人员用作数据库、缓存、流引擎和消息代理的开源内存数据存储。

Redis特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

Redis优势:

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

参考文档:

安装Redis

本节中,我们使用docker安装一个redis节点。

1、下载redis镜像,这里选择版本 redis:5.0.14-alpine3.15

1
docker pull redis:5.0.14-alpine3.15

2、启动redis

1
2
3
docker run --name redis -d \
-p 6379:6379 \
redis:5.0.14-alpine3.15

参考文档:

自定义redis配置

1、准备redis5.0的配置文件

1
2
mkdir -p /opt/redis/
vim /opt/redis/redis.conf

配置内容参考github redis.conf,按需修改

2、使用配置文件

1
2
3
4
5
docker run --name redis -d \
-p 6379:6379 \
-v /opt/redis/redis.conf:/etc/redis/redis.conf \
redis:5.0.14-alpine3.15 \
redis-server /etc/redis/redis.conf

测试Redis

容器内测试

1
2
3
docker exec -it redis /bin/sh
redis-cli
> ping

宿主机测试

1、启动测试容器

1
2
docker run --name redis-client -d \
redis:5.0.14-alpine3.15

2、测试

1
2
docker exec -it redis-client redis-cli -h 192.168.56.102 -p 6379
> ping

重启Redis

docker redis

1
docker restart redis

bin redis

方法一:

1
2
3
/usr/local/bin/redis-server stop
/usr/local/bin/redis-server start /opt/redis/redis.conf
# /usr/local/bin/redis-server restart

方法二:

1
2
redis-cli -h 127.0.0.1 -p 6379 shutdown
redis-server

方法三:

1
2
3
ps -ef | grep redis
kill -9 xxx
redis-server

Redis数据结构

参考文档:Redis【数据结构类型篇】
redis数据结构类型包括:String、List、Hash、Set、ZSet,每种类型都有自己的操作命令。
redis的不同数据结构类型适用于不同的场景。

String

特点:String类型是redis最常用的数据结构类型,存储的值为字符串。

应用场景:
i. 做与统计有关的业务,如新浪微博(微信朋友圈)中的点赞功能。
相关命令:incr、incrby、decr、decrby。

ii. 解决多线程的线程安全问题。
redis的key是单线程模式,这就意味一瞬间只有一个线程能够持有这个key,所以可以使用redis解决部分涉及线程安全的业务,比如说抢购、秒杀。

List

特点:

  • 基于Linked List实现。
  • 元素是字符串类型。
  • 列表头尾增删快,中间增删慢,增删元素是常态。
  • 从左至右,从0开始,从右至左,从-1开始。
  • 元素可以重复出现。
  • 最多包含2^32-1元素。

应用场景:
i. 处理顺序类业务。如新浪微博评论、论坛回帖楼层等。
ii. 聊天室。

Hash

特点:

  • hash内容由field和与之关联的value组成map键值对组成
  • key、field和value是字符串类型
  • 一个hash中最多包含2^32-1键值对

应用场景:
i. 节省资源
redis每创建一个键,都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等等),因此redis的key相对于值来说,更珍贵!!!
reids数据库中的键越多,redis数据库服务器在储存附加管理信息方面耗费的内存就越多,在获取key对应的value值时cpu的开销也会更多。Hash结构可以将具有关联关系的一组key-value,存储到同一个hash结构中,从而减少key的数量。
因此能使用hash的时候尽量使用hash,这也是hash类型的应用场景。

Hash类型不适用的场景:
i. 对某一个field设置过期时间
如果我们仅仅只对一个字段设置过期,就不能使用hash。因为Redis的key的过期功能只能对键操作,而Hash结构不能单独对某一个filed设置过期功能。

Set

特点:

  • 无序的、无重复的
  • 元素是字符串类型
  • 最多包含2^32-1元素

应用场景:
i. 新浪微博的共同关注
当用户访问另一个用户的时候,会显示出两个用户共同关注哪些相同的用户。将每个用户关注的用户放在集合中,求交集即可。

ZSet

特点:

  • 类似Set集合
  • 有序的、无重复的
  • 元素是字符串类型
  • 每一个元素都关联着一个浮点数分值(Score),并按照分值从小到大的顺序排列集合中的元素。注意:分值可以相同
  • 最多包含2^32-1元素

适用场景:
i. 适用于需要有序且唯一的业务或操作:网易音乐排行榜
每首歌的歌名作为元素(唯一、不重复);每首歌的播放次数作为分值;使用zrevrange 命令来获取播放次数最多的歌曲

Redis常用命令

参考文档:Redis命令参考

特别注意:redis命令不区分大小写。

数据库操作

建立连接

1
docker exec -it redis-client redis-cli -h 192.168.56.102 -p 6379

请求客户端与服务器建立连接。

退出连接

1
quit

请求服务器关闭与当前客户端的连接。
一旦所有等待中的回复(如果有的话)顺利写入到客户端,连接就会被关闭。

设置密码

通过设置配置文件中 requirepass 项的值(使用命令 CONFIG SET requirepass password ),可以使用密码来保护 Redis 服务器。

如果开启了密码保护的话,在每次连接 Redis 服务器之后,就要使用 AUTH 命令解锁,解锁之后才能使用其他 Redis 命令。

如果 AUTH 命令给定的密码 password 和配置文件中的密码相符的话,服务器会返回 OK 并开始接受命令输入。

另一方面,假如密码不匹配的话,服务器将返回一个错误,并要求客户端需重新输入密码。

1、设置密码

1
2
config set requirepass secret_password   # 将密码设置为 secret_password
quit

2、使用密码

1
2
3
ping
auth secret_password # 输入正确的密码
ping

设置了密码保护之后,如果想要直接通过redis-cli直接执行redis命令,可以加上-a参数。

1
docker exec -it redis-client redis-cli -h 192.168.56.102 -p 6379 -a 'secret_password' ping

切换数据库

使用select切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值。

1
2
3
4
5
SET db_number 0
SELECT 1
GET db_number
SET db_number 1
GET db_number

统计信息

以一种易于解释(parse)且易于阅读的格式,返回关于 Redis 服务器的各种信息和统计数值。
通过给定可选的参数 section ,可以让命令只返回某一部分的信息:

  • info server: 一般 Redis 服务器信息
  • info clients: 已连接客户端信息
  • info memory: 内存信息
  • info persistence: RDB 和 AOF 的相关信息
  • info stats: 一般统计信息
  • info replication: 主/从复制信息
  • info cpu: CPU 计算量统计信息
  • info commandstats: Redis 命令统计信息
  • info cluster: Redis 集群信息
  • info keyspace: 数据库相关的统计信息
  • info all: 返回所有信息
  • info default: 返回默认选择的信息

当不带参数直接调用 INFO 命令时,使用 default 作为默认参数。

1
2
info memory
info stats

集群操作

cluster命令查看和操作redis集群。
通过给定可选的参数 section ,可以让命令只返回某一部分的信息:

  • cluster info:打印redis集群的信息
  • cluster slots:列出集群的槽信息
  • cluster nodes:列出集群当前已知的所有节点(node),以及这些节点的相关信息
  • cluster meet <ip> <port>:将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子
  • cluster forget <node_id>:从集群中移除 node_id 指定的节点
  • cluster failover:该命令只能在群集slave节点执行,让slave节点进行一次人工故障切换,成为master。切换过程中redis会阻塞请求(10s),切换完成再处理请求。

参考文档:

测试

ping

ping使用客户端向 Redis 服务器发送一个 PING ,如果服务器运作正常的话,会返回一个 PONG 。
通常用于测试与服务器的连接是否仍然生效,或者用于测量延迟值。

echo

打印一个特定的信息 message ,测试时使用。

1
echo "test"

String类型操作

设置key

1
2
select 3
set key_name key_value

查询key

1
2
3
select 3
get key_name
keys *

遍历key

SCAN cursor [MATCH pattern] [COUNT count]
SCAN 命令及其相关的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都用于增量地迭代(incrementally iterate)一集元素(a collection of elements):

  • SCAN 命令用于迭代当前数据库中的数据库键。
  • SSCAN 命令用于迭代集合键中的元素。
  • HSCAN 命令用于迭代哈希键中的键值对。
  • ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。

查看key数量

dbsize:返回当前数据库的 key 的数量。

Hash类型操作

  • hkeys key:返回哈希表 key 中的所有域。
  • hget key field:返回哈希表 key 中给定域field的值
  • hlen key:返回哈希表 key 中域的数量。
  • hgetall key:返回哈希表 key 中,所有的域和值。
  • hexists key field:查看哈希表 key 中,给定域 field 是否存在。
  • hset key field value:将哈希表 key 中的域 field 的值设为 value 。
  • hdel key field [field ...]:删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。

内存碎片率

使用info memory可以查看内存碎片率,内存碎片率计算方法为:
mem_fragmentation_ratio = used_memory_rss / used_memory

内存碎片率大小说明:

  • mem_fragmentation_ratio < 1 表示Redis内存分配超出了物理内存,操作系统正在进行内存交换,内存交换会引起非常明显的响应延迟;
  • mem_fragmentation_ratio > 1 是合理的;
  • mem_fragmentation_ratio > 1.5 说明Redis消耗了实际需要物理内存的150%以上,其中50%是内存碎片率,可能是操作系统或Redis实例中内存管理变差的表现

手动清理内存碎片方法:

1
memory purge

但是,对于redis5.0.14,这个内存碎片率的说明并不适用,经测试查看到的内存碎片率为13-15,远大于1。
参考文档Redis 5.0.11 high memory fragmentation ratio可知:

you are looking at mem_fragmentation_ratio which is not actually fragmentation. It’s the ratio of used memory to RSS (resident physical memory), We don’t rename if for the sake of backwards compatibility.
RSS includes shared libraries, code, stack and other things, so while this metric is useful, it’s not actually fragmentation (which has risk of rising to high values).
If you wanna look at fragmentation, you should look at allocator_frag_ratio instead.
But another point is that your db is nearly empty, so although the ratio seems high, it’s not actually a lot of memory.
allocator_frag_bytes shows just about 400kb.
You only wanna be concerned if that number is high, and in that case you can enable activedefrag

因此,对于redis5.0.14,内存碎片率应该查看 allocator_frag_ratio 而不是 mem_fragmentation_ratio

  • 本文作者: 好好学习的郝
  • 本文链接: https://www.voidking.com/dev-redis-start/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!源站会及时更新知识点及修正错误,阅读体验也更好。欢迎分享,欢迎收藏~