Redis安装及使用

一、简介

  简单来说 redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。

  为什么要用 redis/为什么要用缓存?

  主要从“高性能”和“高并发”这两点来看待这个问题。

  高性能:假如用户第一次访问数据库中的某些数据,这个过程会比较慢,因为是从硬盘上读取的。如果该用户访问的数据存在缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存是直接操作内存,所以速度相对硬盘要快很多。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!

  高并发:redis适合少写多读,符合缓存的适用要求。官方数据表示Redis读的速度是十几万次/s,写的速度是八万次左右/s 。单机redis支撑万级,如果十万以上建议用redis replication模式,也就是集群模式;

二、单机安装

cd /opt
tar -zxvf redis-3.2.12.tar.gz
cd redis-3.2.12
# 编译
make
# 安装
cd ./src
sudo make install PREFIX=/usr/local/redis/redis
sudo cp /opt/redis-3.2.12/redis.conf /usr/local/redis/redis
# 配置,修改以下配置
sudo vim /usr/local/redis/redis/redis.conf
# 允许远程连接
#bind 127.0.0.1
# 保护模式,只允许本地链接
protected-mode no
# appendonly开启持久化
appendonly yes 
# 后台运行
daemonize yes
# 设置密码
requirepass Heheda@2024

# 启动服务(使用自定义配置)
/usr/local/redis/redis/bin/redis-server /usr/local/redis/redis/redis.conf
# 客户端连接
/usr/local/redis/redis/bin/redis-cli -h 127.0.0.1 -p 6379

参考:
Redis介绍和使用
Redis详解
Redis概述

三、命令学习

3.1 基本命令
#查看所有key
keys *  或  keys "*"

#查看匹配前缀的keys
keys "miao*"

#清空redis
flushdb

#查看key的类型
type key

#查看数据库中key的数量
dbsize

#查看服务器信息
info

#查看日志
slowlog get
slowlog get 10

# 设置key的值,若存在则覆盖
set key value

# 重命名
RENAME oldkey newkey

# 向key的字符串追加拼接
append key value

# 获取key对应的值 MGET key1 key2 ... keyN:获取这些key对应的值
get key

# 查看是否存在该元素
EXISTS key

# 删除元素
del key

参考:redis学习教程之一基本命令

3.2 redis 设置键的生存时间或过期时间
# 设置该元素多少秒后失效
EXPIRE key seconds

# 设置该元素多少毫秒后失效
PEXPIRE key milliseconds

# 查看还可以存活多少秒,-2表示key不存在,-1表示永久存储
TTL key

# 取消过期时间
persist key

# unix时间戳,1970.1.1之后,这个绝对时间,将在这个时间删除key。expireat pages:about 1356933600:在2012年12月31日上午12点删除掉关键字
expireat key 时间戳

参考:redis设置键的生存时间或过期时间

  Java 实现:

import redis.clients.jedis.Jedis;
 
public class RedisExpireExample {
    public static void main(String[] args) {
        // 连接到Redis服务器
        Jedis jedis = new Jedis("localhost", 6379);
 
        try {
            // 设置键 "key" 的值为 "value"
            jedis.set("key", "value");
 
            // 设置键 "key" 的过期时间为60秒
            jedis.expire("key", 60);
 
            // 打印键 "key" 的剩余生存时间
            System.out.println("剩余生存时间:" + jedis.ttl("key"));
        } finally {
            // 关闭连接
            jedis.close();
        }
    }
}
3.3 SortSet 排序集合类型操作

  创建一个 sort set 排序集合:

127.0.0.1:6379> zadd b3ebc2e6 0.1 id10
(integer) 1
127.0.0.1:6379> zadd b3ebc2e6 0.5 id11
(integer) 1
127.0.0.1:6379> zadd b3ebc2e6 2.1 id12
(integer) 1
127.0.0.1:6379> zadd b3ebc2e6 0.7 id13
(integer) 1

  我们按照权值从大到小逆序排序显示一下我们的数据:

127.0.0.1:6379> zrevrange b3ebc2e6 0 100
1) "id12"
2) "id13"
3) "id11"
4) "id10"

  我们要删除回复量最低的数据(从小到大的排序后,删除区间为0到0的元素,也就是0本身):

127.0.0.1:6379> zremrangebyrank b3ebc2e6 0 0
(integer) 1
127.0.0.1:6379> zrevrange b3ebc2e6 0 100
1) "id12"
2) "id13"
3) "id11"

  想查看某一个权值数据的排名(zrank 从小到大,zrevrank 从大到小),使用 zrank 指令:

127.0.0.1:6379> zrank b3ebc2e6 id11
(integer) 0
127.0.0.1:6379> zrank b3ebc2e6 id13
(integer) 1
127.0.0.1:6379> zrank b3ebc2e6 id12
(integer) 2
127.0.0.1:6379> zrevrank b3ebc2e6 id11
(integer) 2

  zcard 指令可以返回 SortSet 集合中的元素个数:

127.0.0.1:6379> zcard b3ebc2e6
(integer) 3

  zincrby 指令增加某个权值下的数值,我们给 id11 的数据加 200:

127.0.0.1:6379> zincrby b3ebc2e6 200 id11
"200.5"
127.0.0.1:6379> zrevrange b3ebc2e6 0 100
1) "id11"
2) "id12"
3) "id13"

  最后,想查看某个权值对应的数据值,使用 zscore 就可以了:

127.0.0.1:6379> zscore b3ebc2e6 id12
"2.1000000000000001"

参考:
【Redis缓存机制】7.SortSet排序集合类型操作
Redis sort 排序命令详解

3.4 查看中文

  Redis 在使用命令行操作时,如果查看内容中包含中文,会显示16进制的字符串 \xe4\xb8\xad\xe5\x9b\xbd

127.0.0.1:6379> set k1 '中国'
OK
127.0.0.1:6379> get k1
"\xe4\xb8\xad\xe5\x9b\xbd"

# 解决:
redis-cli 后面加上–-raw
$ redis-cli --raw
127.0.0.1:6379> get k1
中国
3.5 密码设置和查看密码的方法

  redis 没有实现访问控制这个功能,但是它提供了一个轻量级的认证方式,可以编辑 redis.conf 配置来启用认证。

  1. 初始化 Redis 密码:

  在配置文件中有个参数:requirepass 这个就是配置 redis 访问密码的参数; 比如 requirepass test123;(Ps:需重启 Redis 才能生效) redis 的查询速度是非常快的,外部用户一秒内可以尝试多大150K个密码;所以密码要尽量长(对于DBA 没有必要必须记住密码);

  2. 不重启Redis设置密码:

# 设置密码
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""
# 查询密码
127.0.0.1:6379> config set requirepass 123456
OK
127.0.0.1:6379> config get requirepass
(error) NOAUTH Authentication required.
# 密码验证
127.0.0.1:6379> auth 123456
OK
# 再次查询
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "123456"
# PS:如果配置文件中没添加密码 那么redis重启后,密码失效;

  3. 登陆有密码的 Redis

# 在登录的时候的时候输入密码
redis-cli -h 127.0.0.1 -p 6379 -a 123456

# 先登陆后验证
redis-cli -p 6379
redis 127.0.0.1:6379> auth 123456
OK

  AUTH 命令跟其他 redis 命令一样,是没有加密的;阻止不了攻击者在网络上窃取你的密码;

  认证层的目标是提供多一层的保护。如果防火墙或者用来保护 redis 的系统防御外部攻击失败的话,外部用户如果没有通过密码认证还是无法访问 redis 的。

参考:Redis 密码设置和查看密码的方法

3.6 关于 Redis 的 database 相关基础

  Redis 默认提供了16个数据库(database),每个数据库有一个 id,从0到15,他们没有名字,只有 id。

  可以在 Redis 配置文件中修改数据库个数,使用以下配置:

# 代表启动时提供32个数据库
databases 32

  客户端登录 Redis 时默认登录的是 id 为 0 的数据库。不同的数据库中数据隔离保存。使用select id命令可以切换当前数据库,比如:

在这里插入图片描述
  切换数据库后 Redis 命令行会有数据库 id 的标识,另外,0号数据库不显示标识。FLUSHALL 命令会清空所有数据库中的数据库,不只是当前数据库。

  spring-boot 可以在配置文件中设置默认登录的数据库(这样默认登录的数据库就是 5):

spring.redis.database=5

参考:关于Redis的database相关基础

3.7 查看内存占用

  要查看 Redis 的内存占用情况,可以通过以下几种方式进行操作:

  INFO memory : 该命令会返回一个包含内存相关信息的文本,其中包括 used_memory 字段表示已使用内存的大小,used_memory_human 字段表示已使用内存的大小(以人类可读的格式显示)。

  MEMORY STATS:该命令会返回一个包含详细内存统计信息的文本,其中包括 used_memory 字段表示已使用内存的大小,used_memory_human 字段表示已使用内存的大小(以人类可读的格式显示)。

127.0.0.1:6379> INFO memory
# Memory
used_memory:4952568
used_memory_human:4.72M
used_memory_rss:7786496
used_memory_rss_human:7.43M
used_memory_peak:5754256
used_memory_peak_human:5.49M
used_memory_peak_perc:86.07%
used_memory_overhead:1616328
used_memory_startup:865968
used_memory_dataset:3336240
used_memory_dataset_perc:81.64%
allocator_allocated:5176184
allocator_active:6045696
allocator_resident:9076736
total_system_memory:33566556160
total_system_memory_human:31.26G
used_memory_lua:31744
used_memory_vm_eval:31744
used_memory_lua_human:31.00K
used_memory_scripts_eval:0
number_of_cached_scripts:0
number_of_functions:0
number_of_libraries:0
used_memory_vm_functions:32768
used_memory_vm_total:64512
used_memory_vm_total_human:63.00K
used_memory_functions:184
used_memory_scripts:184
used_memory_scripts_human:184B
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:1.17
allocator_frag_bytes:869512
allocator_rss_ratio:1.50
allocator_rss_bytes:3031040
rss_overhead_ratio:0.86
rss_overhead_bytes:-1290240
mem_fragmentation_ratio:1.57
mem_fragmentation_bytes:2834128
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_total_replication_buffers:0
mem_clients_slaves:0
mem_clients_normal:43608
mem_cluster_links:0
mem_aof_buffer:0
mem_allocator:jemalloc-5.3.0
active_defrag_running:0
lazyfree_pending_objects:0
lazyfreed_objects:0
127.0.0.1:6379> MEMORY STATS
 1) "peak.allocated"
 2) (integer) 5754256
 3) "total.allocated"
 4) (integer) 5006688
 5) "startup.allocated"
 6) (integer) 865968
 7) "replication.backlog"
 8) (integer) 0
 9) "clients.slaves"
10) (integer) 0
11) "clients.normal"
12) (integer) 95216
13) "cluster.links"
14) (integer) 0
15) "aof.buffer"
16) (integer) 0
17) "lua.caches"
18) (integer) 0
19) "functions.caches"
20) (integer) 184
21) "db.2"
22) 1) "overhead.hashtable.main"
    2) (integer) 405432
    3) "overhead.hashtable.expires"
    4) (integer) 264944
    5) "overhead.hashtable.slot-to-keys"
    6) (integer) 0
23) "db.10"
24) 1) "overhead.hashtable.main"
    2) (integer) 36192
    3) "overhead.hashtable.expires"
    4) (integer) 0
    5) "overhead.hashtable.slot-to-keys"
    6) (integer) 0
25) "overhead.total"
26) (integer) 1667936
27) "keys.count"
28) (integer) 7559
29) "keys.bytes-per-key"
30) (integer) 547
31) "dataset.bytes"
32) (integer) 3338752
33) "dataset.percentage"
34) "80.63216400146484"
35) "peak.percentage"
36) "87.00843048095703"
37) "allocator.allocated"
38) (integer) 5235728
39) "allocator.active"
40) (integer) 6098944
41) "allocator.resident"
42) (integer) 9129984
43) "allocator-fragmentation.ratio"
44) "1.164870262145996"
45) "allocator-fragmentation.bytes"
46) (integer) 863216
47) "allocator-rss.ratio"
48) "1.4969778060913086"
49) "allocator-rss.bytes"
50) (integer) 3031040
51) "rss-overhead.ratio"
52) "0.8716913461685181"
53) "rss-overhead.bytes"
54) (integer) -1171456
55) "fragmentation"
56) "1.5896047353744507"
57) "fragmentation.bytes"
58) (integer) 2951920

四、踩坑之路

1. 报错:ERR max number of clients reached

  redis maxclients 是 redis server 的重要配置,它决定了客户端的最大连接数量。如果超过了设置的 maxclients,redis 会给新的连接发送 max number of clients reached,并关闭连接。在 Redis 2.4 中,可以同时处理的最大客户端数量存在硬编码限制。 在 Redis 2.6 中,此限制是动态的:默认情况下,它设置为 10000 个客户端,除非 Redis.conf 中的 maxclients 指令另有说明。

  绝大部分原因是由于客户端很多空闲连接都没有被及时释放掉从而导致 connected_clients 非常高,其他可能就是maxclients 设置的太少了,或者就是软硬件存在限制。

客户端:

服务端:

  断开空闲连接:建议先断开部分客户端,不然由于报错:max number of clients reached,无法创建连接。使用 redis-cli 进入命令行,使用 info clients 查看客户端连接数,设置参数 timeout(客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能)自动断开连接,键入 config set timeout 600)。

  相关命令:

127.0.0.1:6379> CONFIG GET maxclients
1) "maxclients"
2) "10000"
127.0.0.1:6379> INFO clients
# Clients
connected_clients:9888
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
127.0.0.1:6379> CONFIG set maxclients 90000
OK
127.0.0.1:6379> CONFIG get maxclients
1) "maxclients"
2) "90000"

127.0.0.1:6379> client list
id=281556 addr=10.8.0.6:43462 fd=11425 name= age=336 idle=336 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=get
id=270210 addr=10.8.0.6:45090 fd=79 name= age=1035 idle=1035 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=get
id=273983 addr=10.8.0.6:53192 fd=3852 name= age=946 idle=946 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=get
...
127.0.0.1:6379> config set timeout 600
OK
127.0.0.1:6379> INFO clients
# Clients
connected_clients:1836
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

参考:解决Redis 连接池报错:ERR max number of clients reached

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小强签名设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值