Redis学习记录

一、nosql和redis

nosql(no only sql)是非关系型数据库,或者叫不只是sql。

redis是用key-value存储的非关系型数据库,默认有16个数据库。用来作为缓存数据库,辅助业务数据库。

redis的key使用”:“,可以识别为文件夹层级
在这里插入图片描述

二、在Centos 7 中用Docker安装并运行Redis

(一)安装并运行

1、在docker hub 中查找redis 镜像

docker search redis

2、从docker hub 中拉取redis 镜像

docker pull redis:6.2.1

3、查看拉取的Redis镜像

docker  images

4、运行 redis服务端

docker run -p 6379:6379  -d  redis:6.2.1  redis-server
参数解释:
docker run:启动命令
--name :给容器起名字
-p :★映射端口号,主机端口:容器端口
-v $PWD/data:/data : 将主机中当前目录下的data挂载到容器的/data
-i : 以交互模式运行。
-t : 进入终端。
-d : 以守护模式后台运行。
--requirepass :设置密码
-e XXX_XXX="xxxxxxxxxxx" : 指定环境变量

5、查看正在运行的容器

docker ps 

6、打开redis 客户端★

docker exec -it  <容器id>  redis-cli

7、输入ping进行测试
打印出pong 表示运行成功。

(二)其他操作:

1、重新启动redis容器

docker   restart   <容器id>

2、结束正在运行的容器

docker  stop  <容器id>    容器优雅退出
docker  kill  <容器id>    容器直接退出

3、删除docker中的容器 (容器在删除前要先结束)

docker  rm   <容器id>  [ <容器id> ...] 

4、删除docker 中的镜像

docker  rmi  <镜像id>  [ <镜像id> ...] 

5、查看正在运行的redis进程

 ps -ef | grep redis

6、进入容器内部

docker exec -it  <容器id>  bash

可以看出Redis镜像是搭建在 简化版ubantu系统之上
在系统中执行:

apt-get   
ls
cd  / 
uname -a  查看系统内核
cd /data   该目录是redis持久化时存储数据的位置

7、查看容器内网ip地址
docker inspect <容器id>

在这里插入代码片

8、查看docker 镜像的版本

docker image inspect <镜像名称>:latest|grep -i version

(三)redis数据库常见操作

select  <number>   切换到指定数据库

keys *  查看数据库中全部的key
set  <key> <value>	设置键值对,若键存在,则替换值,若不存在,则新建键值对
setnx  <key> <value>   设置键值对,若键存在,设置失败,若不存在,则新建键值对
get  <key>   根据键取值
type  <key>	查看指定键的类型
ttl <key>  查看指定键的剩余存储时间
flushdb   清空数据库
flushall   清空数据库

三、基本数据类型

String字符串、list列表、set集合、hash哈希、zset集合

(一)String字符串

set  <key> <value>	设置键值对,若键存在,则替换值,若不存在,则新添键值对
setnx  <key> <value>   设置键值对
get  <key>   根据键取值
append <key>  <add> 将内容添加到原值的末尾
strlen  <key>   查看指定键的值的长度
incr <key>   对指定的键的值加1
decr  <key>  对指定的键的值减1
incrby  <key>   <step> 	对指定的键的值加上指定的步长(step)
decrby <key>  <step>	对指定的键的值减去指定的步长(step)

注:incr /decr/incrby/decrby 操作是原子性的他,因为redis是 单线程多io复用的。
java中的i++是多线程操作,不是原子操作。

setex <key>  <seconds> <value> 添加键值对,设置指定的有效时间
mset <key> <value>  [ <key> <value>   ...]  设置多个键值对
mget  <key>  [  <key> ...]    查看多个键的值
getrange  <key>   <start>   <end>
setrange  <key>   <offset>  <value>

(二)list列表

list集合有序、可重复。

lpush  <key>  <value> [  <value> ... ]   从左开始推入值
rpush   <key>  <value> [  <value> ... ]    从右开始推入值
lpop   <key>  <count>  从左消去count个元素
rpop   <key>  <count>  从右消去count个元素
rpoplpush   <key1>   <count>   <key1>  将key1的右侧元素 删除,放置到key2 的左侧

---------------以上的操作中:l为左(left),r为右(right)--------------------
---------------以下的操作中:l为list--------------------

lrange   <key>  <start>  <end>    根据范围查看列表元素
例:lrange  kk1  0   -1   查看列表全部元素
lindex <key>  <index>     根据索引查看列表元素

llen <key> 查看列表的长度
linsert  <key>  <before/after>   <value>  <newvalue>  在value前面或后面插入newvalue
lrem <key>  <count>  <value>  删除指定个数的相同元素
lset <key>  <index>  <value>  替换列表指定位置的元素

(三)set集合

set 是无序、不可重复的集合。

sadd  <key>  member [member ...]    添加set集合
spop  <key>  [<count>]   随机排出指定个数的元素
smembers   <key>  查看set集合全部元素
sismember  <key>   <value>   	判断指定键的值中元素是否有value,有则返回1,没有则返回0
srandmember <key> <count>    查看随机count个的元素
srem    <key>   <value1> <value2> ...   删除指定key的set值中的某个元素
smove   <source>  <defin>   <value>

sinter  <key1>    <key2> 		查看两个集合元素的交集
sunion   <key1>    <key2>	查看两个集合元素的并集
sdiff  <key1>    <key2>		查看两个集合元素的差集

(四)hash哈希

hset    <key>  <field>  <value>  设置键-字段-值
hget    <key>  <field>  获取键-字段的值
hsetnx	 <key>  <field>  <value>	 当且仅当字段不存在,设置键-字段-值;若字段存在,则设置失败
hincrby	 <key>  <field>  <step>    给指定键-字段 增加指定步长
hexists	 <key>  <field>   判断指定键-字段的值是否存在 
hmset	 <key>  <field>  <value>	[ <field>  <value>	...]	批量设置键-字段-值

hkeys <key>  获取hash集合所有的字段
hvals  <key>	 获取hash集合所有的值

(五)zset集合

zset(sortedSet)是有序、不可重复的集合.
zadd  <key>  <score>  <value> [ <score>  <value> ...]    在zset集合中添加键值对
zrange  <key>  <start>  <end>  [withscores]查看集合中元素
例:zrange  k1 0  -1   查看集合中全部元素
zrange  k1 0  -1   withscores 查看集合中全部元素和评分(从低到高)
zrangebyscores  <key>  <min>  <max>  [withscores]根据评分范围查看集合中元素
zrevrange  <key>  <start>  <end>   [withscores] 按评分从高到低查看集合中元素
zverrangebyscores  <key>  <min>  <max>  [withscores] 根据评分范围从高到低查看集合中元素
zrem  <key>  <value>   删除指定键值对
zrank   <key>  <value>	查看指定键值对的排名
zcount <key> <min>  <max>  查看分数范围内的元素个数

四、发布和订阅

redis发布和订阅是一种消息通信模式,发布者(publish)发布消息,订阅者(subscribe)接受消息。
启动两个Redis客户端
订阅者: subscribe
发布者: publish

五、事务

(一)简介

redis事务与mysql事务不同,redis的事务是队列,没有ACID特性。

  • multi 开启事务
  • 组队阶段:设置队列
  • discard 放弃组队
  • exec 执行事务
  • 执行阶段:执行队列
    在这里插入图片描述

例:

multi
set  k1  v1
set  k2  v2
ket   k3 v3
exec

提示:ok;ok;ok;

失败例1:

multi
set  k1  v1
set  k2  v2
set  k3
exec

提示:(error) EXECABORT Transaction discarded because of previous errors.
在组队中就有语法错误,所有命令都不执行

失败例2:

multi
set k1  v1
incr  k1
set  k2  v2
exec

提示:ok ; error; ok;
在组队中没有语法错误,执行中有错误,只有错误的命令不执行

(二)悲观锁和乐观锁

悲观锁:假定获取数据会修改。在执行前上锁,其他线程不能调用,在执行后解锁,其他线程才可以调用。适用于多写操作。
乐观锁:假定获取数据不会修改。拿取数据时不会上锁,更新数据时会校验 版本号 是否一致。适用于多读操作。

watch key [ key … ] 监听一个或多个key
unwatch key [ key … ] 取消监听一个或多个key

(三)redis事务三特性

(1)单独的隔离操作。事务中的命令都会序列化、按顺序执行。事务执行不会 被其他客户端的命令打断。
(2)没有隔离等级的概念。事务执行之前,命令没有实际执行。
(3)不能保证原子性。事务中命令没有错误,执行中遇到错误,其他命令正常执行。没有回滚。

六、redis的主从复制

(一)简介

redis构成一主(master)多从(slave)的结构,主数据库中的数据复制到从数据库中,客户端对主数据库进行写操作,对从数据库进行读操作。不能多个主同时存在(一山不容二主)。

(二)搭建一主多从

运行三个redis数据库

docker run -p 6379:6379  -d redis:6.2.1 redis-server
45acac3e5251
docker run -p 6380:6379  -d redis:6.2.1 redis-server
22ea8de0ec4b
docker run -p 6381:6379  -d redis:6.2.1 redis-server
163c84c30f0a

查看容器内网ip地址

master
docker inspect 45acac3e5251 
172.17.0.2

slave
docker inspect 22ea8de0ec4b
172.17.0.3
docker inspect 163c84c30f0a
172.17.0.4

三个redis数据库进入客户端

docker exec -it  45acac3e5251  redis-cli
docker exec -it  22ea8de0ec4b  redis-cli
docker exec -it  163c84c30f0a  redis-cli

在从服务器中输入

slaveof    172.17.0.2   6379    连接主服务器

在主-从服务器中分别输入

info  replication  查看主从复制配置

主服务器显示

# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.4,port=6379,state=online,offset=1918,lag=0
slave1:ip=172.17.0.3,port=6379,state=online,offset=1918,lag=0
master_failover_state:no-failover
master_replid:3a62db6f4c83f53a7a3e59e90a2c618b5056b587
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1918
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1918

从服务器显示

# Replication
role:slave
master_host:172.17.0.2
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:1904
slave_priority:100
slave_read_only:1
connected_slaves:0
master_failover_state:no-failover
master_replid:3a62db6f4c83f53a7a3e59e90a2c618b5056b587
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1904
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1904

连接成功后,从服务器会复制主服务器的数据。

(三)3种模式

①一主二仆:详细操作见(二)

②薪火相传(一脉相承/单线联系):
0号从服务器(172.17.0.3) 连接主服务器(172.17.0.2)

slaveof    172.17.0.2   6379    

1号从服务器(172.17.0.4) 连接0号从服务器(172.17.0.3)

slaveof    172.17.0.3   6379    

③反客为主(脱离从属关系):
在从服务器中输入:

slaveof   no    one    不是任何人的从属
posted @ 2023-01-04 10:38  鹤冲天Brody  阅读(5)  评论(0编辑  收藏  举报  来源