Redis学习记录

本文涉及的产品
云数据库 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
相关文章
|
3月前
|
存储 NoSQL 中间件
中间件Redis的学习记录
中间件Redis的学习记录
|
NoSQL MongoDB Redis
redis学习记录
学习redis的记录
|
数据采集 NoSQL Redis
scrapy-redis学习记录(一)
最近在搞爬虫,总听说scrapy多么多么强大,个人认为初学者先自己去理解爬虫的几个重要的点,手动去写爬虫,等到熟悉过后觉得没有提升了再去看框架之类的东西。
1164 0
|
NoSQL Redis 数据安全/隐私保护
Redis学习记录之————微博项目
Key设计 全局相关的key: 表名 global 列名 操作 备注 Global:userid incr 产生全局的userid Global:postid Incr 产生全局的postid           用户相关的key(表...
712 0
|
18天前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
253 0
|
26天前
|
负载均衡 监控 NoSQL
Redis的集群方案有哪些?
Redis集群包括主从复制(基础,手动故障恢复)、哨兵模式(自动高可用)和Redis Cluster(官方分布式解决方案,自动分片和容错)。此外,还有如Codis、Redisson和Twemproxy等第三方工具用于代理和负载均衡。选择方案需考虑应用场景、数据规模和并发需求。
219 2
|
1月前
|
NoSQL Redis
Redis集群(六):集群常用命令及说明
Redis集群(六):集群常用命令及说明
198 0
|
2月前
|
运维 NoSQL 算法
Redis-Cluster 与 Redis 集群的技术大比拼
Redis-Cluster 与 Redis 集群的技术大比拼
83 0
|
3天前
|
存储 NoSQL 算法
Redis 搭建分片集群
Redis 搭建分片集群
13 2
|
26天前
|
NoSQL Java 测试技术
面试官:如何搭建Redis集群?
**Redis Cluster** 是从 Redis 3.0 开始引入的集群解决方案,它分散数据以减少对单个主节点的依赖,提升读写性能。16384 个槽位分配给节点,客户端通过槽位信息直接路由请求。集群是无代理、去中心化的,多数命令直接由节点处理,保持高性能。通过 `create-cluster` 工具快速搭建集群,但适用于测试环境。在生产环境,需手动配置文件,启动节点,然后使用 `redis-cli --cluster create` 分配槽位和从节点。集群动态添加删除节点、数据重新分片及故障转移涉及复杂操作,包括主从切换和槽位迁移。
32 0
面试官:如何搭建Redis集群?

热门文章

最新文章