Redis学习总结(Docker搭建环境)
Posted 玩家_名狱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis学习总结(Docker搭建环境)相关的知识,希望对你有一定的参考价值。
中文版命令学习地址(有些参数没细讲):http://www.redis.cn/commands.html
英文版命令学习地址:https://redis.io/commands
文章目录
一、安装
本次使用Docker安装使用Redis
root@zxh:~# docker pull redis # 下载redis镜像
root@zxh:~# docker run -p 6379:6379 -d redis # 启动redis容器。后台方式运行,并映射容器和主机的端口
root@zxh:~# docker ps # 查看所有正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b4a21afd7dc8 redis "docker-entrypoint.s…" 32 seconds ago Up 31 seconds 0.0.0.0:6379->6379/tcp gracious_poincare
root@zxh:~# docker exec -it b4a21afd7dc8 /bin/bash # 启动容器
进入容器后,执行后面的操作
由于使用Docker的方式没有redis.conf配置文件,所以我们要拿到配置文件
root@b4a21afd7dc8:/data# apt update # 更新源
root@b4a21afd7dc8:/data# apt install -y vim # 安装vim编辑器
root@b4a21afd7dc8:/data# apt install -y wget # 安装wget工具
root@b4a21afd7dc8:/data# cd /usr/local/bin # 进入到redis的安装目录下
root@b4a21afd7dc8:/usr/local/bin# ls # 查看文件
docker-entrypoint.sh gosu redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server
root@b4a21afd7dc8:/usr/local/bin# redis-server --version # 查看版本,然后到官网找到对应的版本下载
Redis server v=6.2.3 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=dc20d908b7b619b4
root@b4a21afd7dc8:/usr/local/bin# wget https://download.redis.io/releases/redis-6.2.3.tar.gz
root@b4a21afd7dc8:/usr/local/bin# tar -zxvf redis-6.2.3.tar.gz # 解压文件
root@b4a21afd7dc8:/usr/local/bin# cp ./redis-6.2.3/redis.conf /usr/local/bin/ # 拷贝里面的配置文件
root@b4a21afd7dc8:/usr/local/bin# rm -rf redis-6.2.3 # 删除文件夹
root@b4a21afd7dc8:/usr/local/bin# cp redis.conf redis.conf.bak # 备份一份配置文件
root@b4a21afd7dc8:/usr/local/bin# ls
docker-entrypoint.sh gosu redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server redis.conf redis.conf.bak
为了方便后面的操作,还要安装一些操作系统的运维工具
root@b4a21afd7dc8:/data# apt install -y iproute2 # 安装ip查看工具
root@b4a21afd7dc8:/data# apt install -y procps # 安装ps查看进程工具
二、启动、关闭
1.启动
redis默认在交互式下运行,但我们希望它是后台的方式运行,因此我们要修改配置文件
root@b4a21afd7dc8:/usr/local/bin# vim redis.conf
里面大概257行,把daemonize no
改为daemonize yes
,之后启动就可以在后台正常运行
使用redis服务工具,通过指定的配置文件redis.conf
启动服务
root@b4a21afd7dc8:/usr/local/bin# redis-server redis.conf
2.查看是否启动成功
第一种方式。使用redis-cli客户端工具,查看redis服务是否启动成功。-p参数指定连接端口
root@b4a21afd7dc8:/usr/local/bin# redis-cli -p 6379
第二种方式。由于我们启动容器时使用了端口映射,所以在主机下可以查看到有关redis服务的进程信息。当然,我们更希望在容器中查看,因此,我们在主机下需要再一次启动redis容器
很可惜,docker的环境中没有ps进程查看工具,因此我们在主机下面查看
我一定要在容器中查看怎么办,可以,在redis容器中安装ps工具
root@b4a21afd7dc8:/data# apt install -y procps
3.基本使用
set
key value,用于设置字符串类型的键值对
get
key,用于获取某个键的值
keys
pattern,pattern是正则表达式,用于获取某些键
4、登陆密码
默认为空,可以添加密码
127.0.0.1:6379> config get requirepass # 获取密码,为空
1) "requirepass"
2) ""
127.0.0.1:6379> config set requirepass "123456" # 设置密码123456
OK
如果我们还在redis-cli客户端中,那么还可以继续执行命令,但是退出再重新进来后,就没有权限执行命令了
127.0.0.1:6379> ping
(error) NOAUTH Authentication required.
127.0.0.1:6379> set name zhong
(error) NOAUTH Authentication required.
可以使用auth
命令登陆
127.0.0.1:6379> auth 123456OK127.0.0.1:6379> pingPONG
5、配置命令
使用redis-cli连接之后,可以使用config get xxxkey
获取的配置值,然后可以使用config set xxxkey xxxvalue
修改值
上面修改密码时已经使用过了
6.关闭redis服务
shutdown
[NOSAVE|SAVE],关闭时可以选择是否保存本次操作的数据
正常主机编译安装的redis,若是关闭redis服务,执行shutdown命令后,只会显示not connected
注意,使用Docker的方式运行Redis服务,若是关闭服务,就会自动关闭并退出容器
再次启动redis容器
启动Redis服务,和之前一样
root@b4a21afd7dc8:/data# redis-server /usr/local/bin/redis.conf
三、redis-benchmark工具
redis-benchmark是一个性能测试工具,用于查看该主机能抗住多少并发量
可选参数如下所示:
序号 | 选项 | 描述 | 默认值 |
---|---|---|---|
1 | -h | 指定服务器主机名 | 127.0.0.1 |
2 | -p | 指定服务器端口 | 6379 |
3 | -s | 指定服务器 socket | |
4 | -c | 指定并发连接数 | 50 |
5 | -n | 指定请求数 | 10000 |
6 | -d | 以字节的形式指定 SET/GET 值的数据大小 | 3 |
7 | -k | 1=keep alive 0=reconnect | 1 |
8 | -r | SET/GET/INCR 使用随机 key, SADD 使用随机值 | |
9 | -P | 通过管道传输 <numreq> 请求 | 1 |
10 | -q | 强制退出 redis。仅显示 query/sec 值 | |
11 | –csv | 以 CSV 格式输出 | |
12 | *-l*(L 的小写字母) | 生成循环,永久执行测试 | |
13 | -t | 仅运行以逗号分隔的测试命令列表。 | |
14 | -/(i 的大写字母) | Idle 模式。仅打开 N 个 idle 连接并等待。 |
root@b4a21afd7dc8:/usr/local/bin# redis-benchmark -h localhost -p 6379 -c 100 -n 100000
测试工具开始运行后,会调用几乎所有命令进行测试,每项测试大概内容如下,以set请求为例
四、Redis的基本概念
默认有16个数据库,在redis.conf文件大概在327行有记录databases 16
,可以修改。默认使用的是0数据库
默认6379端口,大概在98行port 6379
,可以修改。
单线程运行。数据都是在内存中操作,不会发生磁盘的I/O操作,相比之下多线程切换的时间更长
1.切换数据库
select
index
2.查看数据库容量
dbsize
3.删除当前所选数据库的所有键
flushdb
[ASYNC|SYNC]
ASYNC
:异步刷新数据库SYNC
:同步刷新数据库
flushall
[ASYNC|SYNC],删除所有数据库的键
五、5种基本数据类型
一)辅助命令
1、判断某个键是否存在
exists
key [key …]
可以接多个键,存在多少个结果就是多少个
2、移动键到其他数据库
move
key dbIndex
从当前数据库移动某个键到某一个数据库,如果目标数据库已存在或者源数据库不存在,则不操作。返回值为1则成功,为0则失败。
3、设置键的过期时间
expire
key seconds
4、查看键的剩余存活时间
ttl
key
5、查看键的类型
type
key
127.0.0.1:6379> set name zhongOK127.0.0.1:6379> type namestring
二)string(字符串)
1、字符串拼接
append
key value
在尾部追加字符串,并返回新字符串的长度。如果该键不存在,就创建该键,值为空字符串,然后再执行追加操作
2、获取字符串的长度
strlen
key
127.0.0.1:6379> strlen say(integer) 10127.0.0.1:6379> get say"helloworld"
3、字符串类似数字般+1操作
incr
key
4、字符串类似数字般-1操作
decr
key
127.0.0.1:6379> set id 0OK127.0.0.1:6379> decr id(integer) -1127.0.0.1:6379> decr id(integer) -2127.0.0.1:6379> get id"-2"
5、字符串类似数字般+或 - 数字n操作
incrby
key increment
decrby
key increment
incrby也可以做到decrby的功能
127.0.0.1:6379> set test 2
OK
127.0.0.1:6379> incrby test 10
(integer) 12
127.0.0.1:6379> incrby test -8
(integer) 4
6、截取字符串
getrange
key start end
127.0.0.1:6379> get say
"helloworld"
127.0.0.1:6379> getrange say 3 5
"low"
127.0.0.1:6379> getrange say 0 -1
"helloworld"
7、从某个位置开始替换字符串
setrange
key offset value
127.0.0.1:6379> set say helloworldOK127.0.0.1:6379> setrange say 6 niubi(integer) 11127.0.0.1:6379> get say"hellowniubi"
8、如果键存在就修改值和修改过期时间
setex
key seconds value
如果键不存在就新建该键,之后设置值,再设置过期时间
127.0.0.1:6379> set name zhongOK127.0.0.1:6379> setex name 10 "xiao"OK127.0.0.1:6379> get name"xiao"127.0.0.1:6379> ttl name(integer) 4127.0.0.1:6379> get name(nil)
9、如果键不存在就创建该键值对(分布式锁常用)
setnx
key value
如果存在则不做操作
########不存在就创建######127.0.0.1:6379> get name(nil)127.0.0.1:6379> setex name 10 "xiao"OK127.0.0.1:6379> get name"xiao"########存在不做操作#########127.0.0.1:6379> set name zhongOK127.0.0.1:6379> setnx name xiao(integer) 0127.0.0.1:6379> get name"zhong"
10、同时创建多个键值对,获取多个键值对
mset
key value [key value …]
如果设置了相同的键,取最后一个
127.0.0.1:6379> keys *(empty array)127.0.0.1:6379> mset name zhong age 10 OK127.0.0.1:6379> keys *1) "age"2) "name"
mget
key [key …]
127.0.0.1:6379> mget name age1) "zhong"2) "10"
11、如果键不存在就创建多个键值对
msetnx
key value [key value …]
原子性操作,一个设置不成功,所有设置都不成功
127.0.0.1:6379> set name zhongOK127.0.0.1:6379> msetnx name xiao age 10(integer) 0127.0.0.1:6379> keys *1) "name"127.0.0.1:6379> get name"zhong"
12、先获取值,再设置值
getset
key value
先获取值,如果为空就输出nil,不为空就输出原来的值,最后设置值
127.0.0.1:6379> getset say hello(nil)127.0.0.1:6379> getset say world"hello"127.0.0.1:6379> get say"world"
设计键值对的思考
reids中没有json格式类型,如果使用字符串类型,那怎么设计
- 在服务端序列化成字符串之后保存,客户端拿到数据之后再进行反序列化
set user:1 name:zhong,age:18
- 把json中的键放到redis的键中,但是这样的话最好还是使用hash操作方便
mset user:1:name zhong user:1:age 18
三)list(列表)
将值放到列表中,也可以将它作为栈或者队列来使用。
1、将值放入列表中,从左边放入
lpush
key element [element …]
127.0.0.1:6379> lpush age 10 20 30 40(integer) 4127.0.0.1:6379> lpush age 50(integer) 5127.0.0.1:6379> keys *1) "age"
2、获取列表的值
lrange
key start stop
127.0.0.1:6379> lrange age 0 -1 # 取出所有值1) "50"2) "40"3) "30"4) "20"5) "10"127.0.0.1:6379> lrange age 0 21) "50"2) "40"3) "30"
3、将值放入列表中,从右边放入
rpush
key element [element …]
127.0.0.1:6379> rpush age 10 20 30 40(integer) 4127.0.0.1:6379> rpush age 50(integer) 5127.0.0.1:6379> lrange age 0 -11) "10"2) "20"3) "30"4) "40"5) "50"
4、从左边移出n个值
lpop
key [count]
127.0.0.1:6379> lrange age 0 -11) "10"2) "20"3) "30"4) "niu"5) "bi"# 从左边移除2个值127.0.0.1:6379> lpop age 21) "10"2) "20"127.0.0.1:6379> lrange age 0 -11) "30"2) "niu"3) "bi"
5、从右边移出n个值
rpop
key [count]
127.0.0.1:6379> lrange age 0 -11) "30"2) "niu"3) "bi"# 从右边移除1个值127.0.0.1:6379> rpop age 11) "bi"127.0.0.1:6379> lrange age 0 -11) "30"2) "niu"
6、获取某个索引对应的值
lindex
key index
127.0.0.1:6379> lrange age 0 -11) "10"2) "20"3) "30"4) "40"127.0.0.1:6379> lindex age 1"20"127.0.0.1:6379> lindex age -2"30"127.0.0.1:6379> lrange age 0 -1 # 内容不变,只是读取1) "10"2) "20"3) "30"4) "40"
7、查看列表的长度
llen
key
127.0.0.1:6379> llen age(integer) 4127.0.0.1:6379> lrange age 0 -11) "10"2) "20"3) "30"4) "40"
8、移除列表中的值
lrem
key count element
列表是可以存在多个相同的值的,count指定移除多少个相同的值,从左边开始算起
127.0.0.1:6379> lrange age 0 -11) "40"2) "50"3) "10"4) "20"5) "30"6) "40"127.0.0.1:6379> lrem age 2 40(integer) 2127.0.0.1:6379> lrange age 0 -11) "50"2) "10"3) "20"4) "30"
9、截取列表的部分值,剩余的值会被移除出列表
ltrim
key start stop
127.0.0.1:6379> lrange age 0 -1
1) "10"
2) "20"
3) "30"
4) "40"
5) "50"
127.0.0.1:6379> ltrim age 1 3 # 只留下了1、2、3下标的值
OK
127.0.0.1:6379> lrange age 0 -1
1) "20"
2) "30"
3) "40"
10、移除一个列表最右边的值到另一个列表的最左边
rpoplpush
source destination
如果目标列表不存在则创建,如果源列表不存在则返回nil
127.0.0.1:6379> lrange age 0 -1
1) "10"
2) "20"
3) "30"
4) "40"
5) "50"
127.0.0.1:6379> rpoplpush age id
"50"
127.0.0.1:6379> lrange age 0 -1
1) "10"
2) "20"
3) "30"
4) "40"
127.0.0.1:6379> lrange id 0 -1
1) "50"
11、修改某位索引对应的值
lset
key index element
如果该键不存在则报错
127.0.0.1:6379> lrange age 0 -11) "10"2) "20"3) "30"4) "40"127.0.0.1:6379> lset age 1 15OK127.0.0.1:6379> lrange age 0 -11) "10"2) "15"3) "30"4) "40"
12、在某个元素的前面或者后面插入值
linsert
key BEFORE|AFTER pivot element
before代表前面,after代表后面,pivot代表要查找的值
127.0.0.1:6379> lrange age 0 -11) "10"2) "15"3) "30"4) "40"127.0.0.1:6379> linsert age after "30" 35 # 在元素30的后面插入值35(integer) 5127.0.0.1:6379> lrange age 0 -11) "10"2) "15"3) "30"4) "35"5) "40"
列表的思考
原理上是一个链表,如果把里面的元素移除空了,该链表也就不存在了,所以该列表也不存在了。
在链表左右两边改动值效率是最高的,如果要操作中间的值,就需要遍历效率差
四)set(集合)
无序不重复集合
1、添加成员
sadd
key member [member …]
127.0.0.1:6379> sadd age 10 20 30 10(integer) 3127.0.0.1:6379> sadd age 40(integer) 1
2、输出所有成员
smembers
key
127.0.0.1:6379> smembers age1) "10"2) "20"3) "30"4) "40"
3、判断某个成员是否存在
sismember
key member
127.0.0.1:6379> sismember age 20 # 存在(integer) 1127.0.0.1:6379> sismember age 60 # 不存在(integer) 0
4、获取集合的成员个数
scard
key
127.0.0.1:6379> smembers age1) "10"2) "20"3) "30"4) "40"127.0.0.1:6379> scard age(integer) 4
5、移除某些成员
srem
key member [member …]
127.0.0.1:6379> smembers age1) "10"2) "20"3) "30"4) "40"127.0.0.1:6379> srem age 20 40(integer) 2127.0.0.1:6379> smembers age1) "10"2) "30"
6、随机获取n个成员
srandmember
key [count]
127.0.0.1:6379> srandmember age"40"127.0.0.1:6379> srandmember age 21) "30"2) "10"127.0.0.1:6379> srandmember age 21) "20"2) "40"127.0.0.1:6379> srandmember age 1"10"
7、随机移除n个元素
spop
key [count]
127.0.0.1:6379> smembers age1) "10"2) "20"3) "30"4) "40"5) "50"6) "60"127.0.0.1:6379> spop age 21) "50"2) "20"127.0.0.1:6379> smembers age1) "10"2) "30"3) "40"4) "60"
8、移动一个集合中的一个成员到另一个集合
smove
source destination member
如果目标集合不存在则创建,如果源集合不存在则不操作
127.0.0.1:6379> smembers age1) "10"2) "30"3) "40"4) "60"127.0.0.1:6379> smembers id(empty array)127.0.0.1:6379> smove age id 10(integer) 1127.0.0.1:6379> smembers age1) "30"2) "40"3) "60"127.0.0.1:6379> smembers id1) "10"
9、n个集合的差集
sdiff
key [key …]
以第一个集合为参照对比
127.0.0.1:6379> sadd age 10 20 30 40 50 60(integer) 6127.0.0.1:6379> sadd id 15 20 35 45 51(integer) 5127.0.0.1:6379> sdiff age id1) "10"2) "30"3) "40"4) 以上是关于Redis学习总结(Docker搭建环境)的主要内容,如果未能解决你的问题,请参考以下文章
Docker环境下创建Redis集群出现ERR Invalid node address specified: redis1:6379错误
一文教您如何通过 Docker 快速搭建各种测试环境(Mysql, Redis, Elasticsearch, MongoDB) | 建议收藏