redis是一种基于key-value的Nosql数据库,redis中的值可以由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构的算法组成。 Redis可以满足多种应用场景(缓存、排行榜、计数器、抢购等),因为Redis将数据存放在内存中所以读写性能非常快,Redis采用了单线程的架构和I/O多路服用模型来实现高性能的内存数据库服务,预防多线程可能产生的竞争问题

为什么单线程还这么快 第一、纯内存访问,redis将所有数据放在内存中,内存的相应市场大约为100纳秒, 第二、非阻塞I/O,redis使用epoll作为I/O多路复用技术的实现再加上Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络上浪费过多时间。 第三、单线程避免了线程切换(锁和线程切换)和竞态产生的消耗

1、redis版本下载和安装

# wget https://download.redis.io/releases/redis-6.2.14.tar.gz
# tar -zxvf redis-6.2.14.tar.gz
# cd redis-6.2.14
# make && make install

1.2、src目录下的几个可执行文件

可执行文件 说明
redis-server 启动redis
redis-cli redis命令行工具
redis-sentinel 启动redis sentinel哨兵
redis-trib.rb redis集群配置管理工具
redis-check-rdb rdb持久化文件检测和修复工具
redis-check-aof aof持久化文件检测和修复工具
redis-benchmark redis基准检测工具

1.3、修改配置文件

# cp redis.conf redis.conf_bak #修改前备份配置文件

image.png

bind 参数默认是127.0.0.1和本机的IPV6地址,这里一般我们写本机的内网ip protected-mode yes port 6379 端口默认6379 daemonize no 修改为yes,后台启动

2、启动redis

# vim redis.conf
# src/redis-server redis.conf
# ps -ef | grep redis    //查看进程是否启动
root      9946     1  0 07:42 ?        00:00:00 src/redis-server 192.168.1.15:6379
root      9952  5040  0 07:42 pts/0    00:00:00 grep --color=auto redis
# src/redis-cli -h 192.168.1.15 -p 6379

image.png

3、redis常用命令

命令 说明
set 插入一个键值
get 获取key的值
keys 将所有的key输出,生产环境禁止使用
scan 渐进式遍历方式
del 删除一个指定的key
exists 判断key是否存在
expire 给一个key设置有效期,有效期到期时该key会自动删除
ttl 查看一个key的剩余有效期
dbsize 返回当前数据库的键总数
#插入3个key
192.168.1.15:6379> set jia haijiao
OK
192.168.1.15:6379> set hello  world
OK
192.168.1.15:6379> set ad  bj
OK

#查看所有key
192.168.1.15:6379> keys *   
1) "jia"
2) "ad"
3) "hello"

#key的总数量
192.168.1.15:6379> dbsize
(integer) 3

#判断key是否存在,存在返回1,不存在返回0
192.168.1.15:6379> EXISTS jia
(integer) 1
192.168.1.15:6379> EXISTS haha
(integer) 0

#删除一个key,再查看不存在
192.168.1.15:6379> del hello
(integer) 1
192.168.1.15:6379> EXISTS hello
(integer) 0

#设置键过期时间为10秒
192.168.1.15:6379> set hello world
OK
192.168.1.15:6379> expire hello 10
(integer) 1

#ttl会返回键的剩余时间,大于等于0是剩余时间,
192.168.1.15:6379> ttl  hello
(integer) 3
192.168.1.15:6379> ttl  hello
(integer) 2
192.168.1.15:6379> ttl  hello
(integer) 1

#-2键不存在
192.168.1.15:6379> ttl  hello
(integer) -2

#-1键值没有设置过期时间
192.168.1.15:6379> ttl  jia
(integer) -1

# 批量插入数据mset
192.168.1.15:6379> mset a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17
OK
192.168.1.15:6379> DBSIZE
(integer) 19

#现在要遍历所有键,第一次遍历从0开始,返回第一部分:值9,是下次scan需要的油标,第二部分是键,
192.168.1.15:6379> SCAN 0
1) "9"
2)  1) "g"
    2) "jia"
    3) "m"
    4) "k"
    5) "a"
    6) "d"
    7) "f"
    8) "e"
    9) "p"
   10) "ad"
   11) "b"
#第二次遍历,第一部分返回0说明所有件已经遍历过,第二部分是键,
192.168.1.15:6379> scan 9
1) "0"
2) 1) "q"
   2) "c"
   3) "i"
   4) "h"
   5) "o"
   6) "n"
   7) "j"
   8) "l"
192.168.1.15:6379>

生产环境不要使用keys命令。如果数据比较多,执行keys命令会造成阻塞,影响线上业务,有时候确实需要遍历键怎么办呢,如果确认键值总数比较少,可以执行。在一个不对外提供服务的从节点执行,这样不会阻塞客户端的请求,还有就是使用scan命令渐进式的遍历所有键。