Redis学习记录

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis学习记录

一、nosql和redis

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

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

redis的key使用”:“,可以识别为文件夹层级

21.png


二、在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 执行事务
  • 执行阶段:执行队列


22.png


例:

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


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

slaveof    172.17.0.3   6379

③反客为主(脱离从属关系):

在从服务器中输入:

slaveof   no    one    不是任何人的从属
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
存储 NoSQL Redis
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
85 1
|
2月前
|
NoSQL 数据可视化 Linux
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
本文介绍了Redis的两个可视化管理工具:付费的Redis Desktop Manager和免费的Another Redis DeskTop Manager,包括它们的下载、安装和使用方法,以及在使用Another Redis DeskTop Manager连接Redis时可能遇到的问题和解决方案。
151 1
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
|
2月前
|
NoSQL Linux Redis
Docker学习二(Centos):Docker安装并运行redis(成功运行)
这篇文章介绍了在CentOS系统上使用Docker安装并运行Redis数据库的详细步骤,包括拉取Redis镜像、创建挂载目录、下载配置文件、修改配置以及使用Docker命令运行Redis容器,并检查运行状态和使用Navicat连接Redis。
330 3
|
6月前
|
NoSQL Java Redis
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
87 0
|
6月前
|
存储 消息中间件 缓存
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
101 0
|
6月前
|
存储 NoSQL 算法
Redis系列学习文章分享---第十篇(Redis快速入门之附近商铺+用户签到+UV统计)
Redis系列学习文章分享---第十篇(Redis快速入门之附近商铺+用户签到+UV统计)
46 0
|
6月前
|
存储 NoSQL Redis
Redis系列学习文章分享---第九篇(Redis快速入门之好友关注--关注和取关 -共同关注 -Feed流实现方案分析 -推送到粉丝收件箱 -滚动分页查询)
Redis系列学习文章分享---第九篇(Redis快速入门之好友关注--关注和取关 -共同关注 -Feed流实现方案分析 -推送到粉丝收件箱 -滚动分页查询)
72 0
|
6月前
|
消息中间件 负载均衡 NoSQL
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
77 0
|
6月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
246 0
|
2月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
39 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。