redis相关操作使用

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
日志服务 SLS,月写入数据量 50GB 1个月
简介: redis

redis

1. 安装

1. 下载

官网

redis.io

历史下载链接

https://download.redis.io/releases/

2. 编译

采用alpine系统

# 更新系统
$ apk add update
$ apk add upgrade
# 安装对应组件
$ apk add make gcc g++ gcc-c++ linux-headers tcl
# 下载redis, 这里采用4.09
$ wget https://download.redis.io/releases/redis-4.0.9.tar.gz
# 解压
$ tar -xvf redis-4.0.9.tar.gz
# 编译
$ cd redis-4.0.9
$ make
$ make test
# 安装编译好的
$ apk add redis=5.0.11-r0
# 开机自启
$ rc-update add redis

2. 配置

1. Redis 可执行文件说明

1. V5.0版本可执行文件说明

可执行文件 作用
redis-benchmark Redis 基准测试工具
redis-check-aof Redis AOF 持久化文件检测和修复工具
redis-check-rdb Redis RDB 持久化文件检测和修复工具
redis-cli Redis 命令行客户端
redis-sentinel 启动 Redis Sentinel
redis-server 启动 Redis

2. V3.0版本可执行文件说明

可执行文件 作用
redis-benchmark Redis 基准测试工具
redis-check-aof Redis AOF 持久化文件检测和修复工具
redis-check-dump Redis RDB 持久化文件检测和修复工具
redis-cli Redis 命令行客户端
redis-sentinel 启动 Redis Sentinel
redis-server 启动 Redis

2. 启动 Redis

有三种方式启动Redis

默认配置, 运行配置, 配置文件启动

1. 默认配置

这种方法会使用Redis的默认配置来启动

$ redis-server
22933:C 22 Apr 2021 17:14:51.126 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
22933:C 22 Apr 2021 17:14:51.127 # Redis version=5.0.11, bits=64, commit=a980b7f2, modified=0, pid=22933, just started
22933:C 22 Apr 2021 17:14:51.127 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
22933:M 22 Apr 2021 17:14:51.128 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 5.0.11 (a980b7f2/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 22933
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

22933:M 22 Apr 2021 17:14:51.128 # Server initialized
22933:M 22 Apr 2021 17:14:51.129 * Ready to accept connections
当前 Redis 版本是 5.0.11

Redis 默认端口是 6479

Warning 建议以配置文件来启动

2. 运行配置

# 使用其他端口启动 Redis 
$ redis-server --port 6380
如果有很多配置需要修改的话, 使用 配置文件更佳

3. 配置文件启动

Redis目录下都会有一个redis.conf配置文件

一般会在一台机器上面启动多个redis, 并且配置集中管理在指定目录下

4. Redis 设置

# 写入参数
$ echo "vm.overcommit_memory = 1">> /etc/sysctl.conf
# 生效
$ sysctl -p

3. Redis 命令行客户端

1. 交互式方式

通过 redis-cli -h{host} -p{prot}的方式连接到Redis服务
$ redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"

2. 命令方式

通过 redis-cli -h{host} -p{port} {command}直接返回命令结果
$ redis-cli -h 127.0.0.1 -p 6379 get hello

3. 停止Redis服务

# 停止不生成持久化文件
$ redis-cli shutdown
28552:M 22 Apr 2021 18:47:03.306 # User requested shutdown...
28552:M 22 Apr 2021 18:47:03.306 * Saving the final RDB snapshot before exiting.
28552:M 22 Apr 2021 18:47:03.307 * DB saved on disk
28552:M 22 Apr 2021 18:47:03.307 # Redis is now ready to exit, bye bye...
# 停止, 生成持久化文件
$ redis-cli shutdown {nosave|save}
  1. Redis关闭的过程: 断开与客户端的连接, 持久化文件生成, 是一种相对优雅的关闭方式
  2. 除了通过shutdown方式外, 也可以使用kill方式关闭, 尽量不要使用kill -9的方式关闭
  3. shudown还有一个参数, 代表是否在关闭前, 生成持久化文件

4. Redis版本说明

非稳定版本: 2.7, 2.9, 3.1

稳定版本: 2.6, 2.8, 3.0, 3.2

3. 使用

1. 相关命令

Redis有5种数据结构, 它们是键值对中的值, 对于键来说有一些通用的命令

在线上环境中, 禁止使用查看所有键keys, 使用desize

1. 查询所有键

$ redis-cli -h 127.0.0.1 -p 6379
# 插入字符串类型的键值对
$ set hello world
ok
$ set java jvm
ok
$ keys *
1) "hellow"
2) "java"

2. 查询键总数

$ dbsize
(integer) 2
# 插入一个列表类型的键值对(值是多个元素组成)
$ rpush mylist a b c d e f g
(integer) 7
$ dbsize
(integer) 3

3. 检测键是否存在

# exists key
$ exists hello
(integer) 1
$ exists aa
(integer) 0

4. 删除键

del是一个通用的命令, 无论值是什么数据结构类型, del命令都能删除

同时del命令可以删除多个键

# del key [key ...]
$ del hello
(integer) 1

5. 设置键过期

Redis 支持对键添加过期时间, 当超过过期时间后, 会自动删除键
# expire key time
$ set hello world
ok
$ expire hello 10
(integer) 1

6. 查询键过期

ttl命令会返回键的剩余过期时间, 它有三种返回值

大于等于0的证书: 键剩余的过期时间

-1: 键没设置过期时间

-2: 键不存在

$ ttl hello
(integer) -2
# 返回结果为-2, 说明键 hello 已经被删除
$ set hello world
OK
$ ttl hello
(integer) -1
# 返回将结果为-1, 说明键 hello 没有设置过期时间
$ expire hello 20
(integer) 1
$ ttl hello
(integer) 13
# 返回大于等于0以上的数字, 说明键 hello 有设置过期时间,并且剩余时间 13s
# 等待20s后查询
$ ttl hello
(integer) -2
# 返回结果为-2, 说明键 hello 已经被删除

7. 键的数据结构类型

type key
# 设置string类型的键值对
$ set a b
OK
# 结果与设置的一致
$ type a
string
# 设置list类型的键值对
$ rpush mylist1 a b c d e f g
(integer) 7
# 结果与设置一致
$ type mylist1
list
$ type aaaa
none

2. 数据结构和内部编码

type命令实际返回的是当前键的数据结构类型, 分别有

string(字符串), hash(哈希), list(列表), set(集合), zset(有序集合)

通过object encoding 查询内部编码

$ object encoding java
"embstr"
$ object encoding mylist
"quicklist"
  1. 数据结构

  1. 内部编码

    quicklist结合了 ziplistlinkedlist两者的优势
    • list -> quicklist(快速列表)

3. 单线程架构

Redis使用了单线程架构和I/O多路复用模型来实现高性能内存数据库服务

1. 引出单线程模型

Redis客户端与服务端的模型可以简化为如下所示

每次客户端调用都经历了发送命令, 执行命令, 返回结果三个过程

  • Redis客户端与服务端请求过程

  • 所有命令在一个队列里排队等待被执行

  • 不存在多个命令被同时执行的情况

现在开启了三个redis-cli客户端同时执行命令

客户端1设置一个字符串键值对

$ set hello world

客户端2设置对counter做自增操作

$ incr counter

客户端3对counter做自增操作

$ incr counter

2. 单线程解析

通常来讲. 单线程要比多线程差, 但是在redis中, 有以下优势
  1. 纯内存访问
  2. 非阻塞I/O
  3. 单线程避免了线程切换和竞态生产的消耗

4. 字符串

字符串类型是 Redis 最基础的数据结构

4. 使用技巧

1. 慢查询分析

客户端命令的生命周期

  1. 发送命令
  2. 命令排队
  3. 命令执行
  4. 返回结果

慢查询统计命令执行的时间

2. 慢查询命令

有两种方法, 配置文件修改和慢查询

showlog-log-slower-than=0 记录所有命令

showlog-log-slower-than<0 不会记录任何命令

slowlog-max-len 慢日志最多存储多少条

1. 配置文件

2. 命令行

# 在执行时间大于20000微秒时会被记录
$ config set slowlog-log-slower-than 20000
# 1000条
$ config set slowlog-max-len 1000
$ config rewrite

3. 查询慢日志

# slowlog get [n]
# 查询所有慢日志
$ slowlog get
# id 发生时间戳 命令耗时 执行参数和命令
1) 1) (integer) 666
2) (integer) 1456786500
3) (integer) 11615
4) 1) "BGREWRITEAOF"
# 获取慢日志列表的长度
# slowlog len
$ slowlog len
(integer) 45
# 重置慢日志
$ slowlog reset

5. 设置内存, 并发

1. 设置并发

1. 系统相关设置

# 设置最大打开文件数
# Centos7
# 两种方式
# 非systemd启动
# 临时生效
$ ulimit -n
# 永久生效
$ echo "redis soft nofile 10000
redis hard nofile 10000">> /etc/security/limits.conf
# systemd启动
vim /usr/lib/systemd/system/redis.service
[Service]
LimitNOFILE=65536
# 重启daemon
$ systemctl daemon-reload

2. Redis 设置

2.6之后, 2.6之前需要注意
  1. 查看连接数
# 查看最大连接数
$ config get maxclients
1) "maxclients"
2) "10000"
# 查看当前连接数
$ info clients
# Clients
connected_clients:1
client_recent_max_input_buffer:2
client_recent_max_output_buffer:0
blocked_clients:0
  1. 设置最大连接数
# 临时生效最大连接数
# 目前设置为200
$ config set maxclients 200
# 永久设置, 重启生效
$ vim /etc/redis.conf
maxclients 10000
# 配合生效
# 先在线设置最大链接数, 然后在配置文件中修改, 重启后依然生效

2. 设置内存

1. 查询内存

$ info memory
# Memory
used_memory:818295
# 已经使用了的内存大小, 包括redis进程内部开销和你的cache的数据所占用的内存, 单位byte
used_memory_human:799.12K
# 用户数据所占用的内存, 就是你缓存的数据的大小
used_memory_rss:2449408
# 表示redis物理内存的大小, 即向OS申请了多少内存
used_memory_rss_human:2.34M
used_memory_peak:818295
# redis内存使用的峰值
used_memory_peak_human:799.12K
used_memory_peak_perc:100.00%
used_memory_overhead:817569
used_memory_startup:767579
used_memory_dataset:726
used_memory_dataset_perc:1.43%
allocator_allocated:785461
allocator_active:2411520
allocator_resident:2411520
total_system_memory:2093330432
total_system_memory_human:1.95G
used_memory_lua:37888
# redis lua内存使用的峰值
used_memory_lua_human:37.00K
used_memory_scripts:0
used_memory_scripts_human:0B
number_of_cached_scripts:0
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:3.07
allocator_frag_bytes:1626059
allocator_rss_ratio:1.00
allocator_rss_bytes:0
rss_overhead_ratio:1.02
# 内存碎片率
# >1 表示有碎片, 越大表明越多
# <1 表示使用虚拟内存
# 一般来说, 在1~1.5之间最好
rss_overhead_bytes:37888
mem_fragmentation_ratio:3.12
mem_fragmentation_bytes:1663947
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:49694
mem_aof_buffer:0
mem_allocator:libc
# 在编译时指定的Redis使用的内存分配器
# libc、jemalloc、tcmalloc, 默认是jemalloc
active_defrag_running:0
lazyfree_pending_objects:0

2. 设置内存

# 单位大小bytes
# 临时生效
$ config set maxmemory
# 永久生效(需要重启)
$ vim /etc/redis
# 设置1GB, 需要转化为bytes=1073741824
maxmemory 1073741824
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
6月前
|
存储 缓存 NoSQL
【Go语言专栏】Go语言中的Redis操作与缓存应用
【4月更文挑战第30天】本文探讨了在Go语言中使用Redis进行操作和缓存应用的方法。文章介绍了Redis作为高性能键值存储系统,用于提升应用性能。推荐使用`go-redis/redis`库,示例代码展示了连接、设置、获取和删除键值对的基本操作。文章还详细阐述了缓存应用的步骤及常见缓存策略,包括缓存穿透、缓存击穿和缓存雪崩的解决方案。利用Redis和合适策略可有效优化应用性能。
139 0
|
4月前
|
NoSQL Linux Redis
Redis性能优化问题之想确认Redis延迟变大是否因为fork耗时导致的,如何解决
Redis性能优化问题之想确认Redis延迟变大是否因为fork耗时导致的,如何解决
|
5月前
|
缓存 NoSQL Redis
redis管道操作(节省网络IO开销)
pipeline中发送的每个command都会被server立即执行,如果执行失败,将会在此后的响应中得到信息;也就是pipeline并不是表达“所有command都一起成功”的语义,管道中前面命令失败,后面命令不会有影响,继续执行。
47 1
|
5月前
|
NoSQL Java Redis
如何在 Java 中操作这些 Redis 数据结构的基本方法
如何在 Java 中操作这些 Redis 数据结构的基本方法
40 2
|
5月前
|
NoSQL 数据管理 关系型数据库
数据管理DMS操作报错合集之控制台查看Redis时出现乱码是什么导致的
数据管理DMS(Data Management Service)是阿里云提供的数据库管理和运维服务,它支持多种数据库类型,包括RDS、PolarDB、MongoDB等。在使用DMS进行数据库操作时,可能会遇到各种报错情况。以下是一些常见的DMS操作报错及其可能的原因与解决措施的合集。
|
5月前
|
DataWorks NoSQL Java
DataWorks操作报错合集之数据集成使用公共数据集成资源组写入到redis数据源(使用的是VPC连接),提示以下错误:request action:[InnerVpcGrantVpcInstanceAccessToApp], message:[InvalidInstanceId.怎么解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
5月前
|
存储 NoSQL Go
轻松上手,使用Go语言操作Redis数据库
轻松上手,使用Go语言操作Redis数据库
|
5月前
|
NoSQL Redis
加速 Redis 操作:掌握管道技术提升性能与效率
加速 Redis 操作:掌握管道技术提升性能与效率
|
5月前
|
NoSQL Java Redis
【Redis】 Java操作客户端命令——列表操作与哈希操作
【Redis】 Java操作客户端命令——列表操作与哈希操作
|
5月前
|
NoSQL Java Linux
【Redis】 使用Java操作Redis的客户端
【Redis】 使用Java操作Redis的客户端