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进程查看工具,因此我们在主机下面查看
xxx

我一定要在容器中查看怎么办,可以,在redis容器中安装ps工具

root@b4a21afd7dc8:/data# apt install -y procps

3.基本使用

set key value,用于设置字符串类型的键值对

get key,用于获取某个键的值

keys pattern,pattern是正则表达式,用于获取某些键

xxx

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],关闭时可以选择是否保存本次操作的数据

sss

正常主机编译安装的redis,若是关闭redis服务,执行shutdown命令后,只会显示not connected

注意,使用Docker的方式运行Redis服务,若是关闭服务,就会自动关闭并退出容器

再次启动redis容器

xxx

启动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-k1=keep alive 0=reconnect1
8-rSET/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请求为例

xxx

四、Redis的基本概念

默认有16个数据库,在redis.conf文件大概在327行有记录databases 16,可以修改。默认使用的是0数据库

默认6379端口,大概在98行port 6379,可以修改。

单线程运行。数据都是在内存中操作,不会发生磁盘的I/O操作,相比之下多线程切换的时间更长

1.切换数据库

select index

xxx

2.查看数据库容量

dbsize

xxx

3.删除当前所选数据库的所有键

flushdb [ASYNC|SYNC]

  • ASYNC:异步刷新数据库
  • SYNC:同步刷新数据库

xxx

flushall [ASYNC|SYNC],删除所有数据库的键

五、5种基本数据类型

一)辅助命令

1、判断某个键是否存在

exists key [key …]

xxx

可以接多个键,存在多少个结果就是多少个

2、移动键到其他数据库

move key dbIndex

从当前数据库移动某个键到某一个数据库,如果目标数据库已存在或者源数据库不存在,则不操作。返回值为1则成功,为0则失败。

xxx

3、设置键的过期时间

expire key seconds

xxx

4、查看键的剩余存活时间

ttl key

xxx

5、查看键的类型

type key

127.0.0.1:6379> set name zhongOK127.0.0.1:6379> type namestring

二)string(字符串)

1、字符串拼接

append key value

在尾部追加字符串,并返回新字符串的长度。如果该键不存在,就创建该键,值为空字符串,然后再执行追加操作

xxx

2、获取字符串的长度

strlen key

127.0.0.1:6379> strlen say(integer) 10127.0.0.1:6379> get say"helloworld"

3、字符串类似数字般+1操作

incr key

xxx

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

xxx

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格式类型,如果使用字符串类型,那怎么设计

  1. 在服务端序列化成字符串之后保存,客户端拿到数据之后再进行反序列化

set user:1 {name:zhong,age:18}

  1. 把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

以上是关于Redis学习总结(Docker搭建环境)的主要内容,如果未能解决你的问题,请参考以下文章

Redis进阶学习总结(Docker搭建环境)

Redis进阶学习总结(Docker搭建环境)

Docker 学习笔记总结

Docker 学习笔记总结

一文教您如何通过 Docker 快速搭建各种测试环境(Mysql, Redis, Elasticsearch, MongoDB) | 建议收藏

在windows环境里,用Docker搭建Redis开发环境(新书第一个章节)