Redis学习笔记

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

redis安装

# mkdir -p /data/soft

# mkdir -p /data/redis_cluster/redis_6379

# cd soft/

# wget http://download.redis.io/releases/redis-3.2.12.tar.gz

# mkdir -p /opt/redis_cluster/redis_6379/{conf,logs,pid}

#  tar zxf redis-3.2.12.tar.gz -C /opt/redis_cluster/

# 创建软连接

# ln -s redis-3.2.12 redis

[root@666 utils]# ./install_server.sh

运行这个脚本生成官方配置文件

[root@666 conf]# pwd

/opt/redis_cluster/redis_6379/conf

[root@666 conf]# vim redis_6379.conf

### 以守护进程模式启动

daemonize yes

### 绑定主机地址

bind 192.168.200.30

### 监听端口

port 6379

### pid文件和log文件的保存地址

pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid

logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log

### 设置数据库数量,默认数据库为0

databases 16

### 指定本地持久化文件的文件名,默认是dump.rdb

dbfilename redis_6379.rdb

### 本地数据库的目录

dir /opt/redis_cluster/redis_6379

密码

requirepass 123456

redis-cli -a 123456

启动redis

# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf

# redis-cli

关闭

redis-cli -h 127.0.0.1 shutdown

192.168.200.30:6379> set k1 v1

OK

192.168.200.30:6379> keys *

1) "k1"

192.168.200.30:6379> get k1

"v1"

192.168.200.30:6379>

192.168.200.30:6379> MSET k1 v1 k2 v2 k3 v3 k4 v4 k5 v5

OK

192.168.200.30:6379> get k3

"v3"

192.168.200.30:6379> MGET k1 k2 k3 k4 k5

1) "v1"

2) "v2"

3) "v3"

4) "v4"

5) "v5"

查看是否存在

192.168.200.30:6379> EXISTS k2

删除

192.168.200.30:6379> DEL k1

过期时间

EXPIRE K1 10

TTL k1

-1 永不过期

-2 没有这个key

数字

解除过期时间

PERSIST k2

列表

192.168.200.30:6379> RPUSH list1 1

(integer) 1

192.168.200.30:6379>

192.168.200.30:6379> type list1

list

192.168.200.30:6379> LPUSH list1 kang

(integer) 2

列表长度

192.168.200.30:6379> LLEN list1

(integer) 2

192.168.200.30:6379> LRANGE list1 0 -1

1) "kang"

2) "1"

192.168.200.30:6379> LRANGE list1 1 1

1) "1"

右删除

192.168.200.30:6379> RPOP list1

"1"

192.168.200.30:6379> LPUSH list1 1 2 3 4 5 6 7

(integer) 9

左删除

192.168.200.30:6379> LPOP list1

"7"

哈希

192.168.200.30:6379> HMSET student:cloud-computing name kang age 22 job it

OK

192.168.200.30:6379> HMGET student:cloud-computing name

1) "kang"

192.168.200.30:6379> HGETALL student:cloud-computing

1) "name"

2) "kang"

3) "age"

4) "22"

5) "job"

6) "it"

集合

192.168.200.30:6379> SADD set1 1 3 5 7 9

(integer) 5

192.168.200.30:6379> SADD set2 2 4 6 8 10

(integer) 5

192.168.200.30:6379> SMEMBERS set1

1) "1"

2) "3"

3) "5"

4) "7"

5) "9"

6) "13579"

# 以前面的为标准

192.168.200.30:6379> SDIFF set1 set2

1) "1"

2) "3"

3) "5"

4) "7"

5) "9"

6) "13579"

交集

192.168.200.30:6379> SINTER set1 set2

1) "2"

192.168.200.30:6379> sadd lxl pg1 baoqiang alexsbb lidao

(integer) 4

192.168.200.30:6379> sadd jn1 baoqiang qianghe hedao bingbing

(integer) 4

并集

192.168.200.30:6379> SUNION lxl jn1

1) "qianghe"

2) "lidao"

3) "bingbing"

4) "baoqiang"

5) "hedao"

6) "alexsbb"

7) "pg1"

Redis持久化

RDB  AOF

192.168.200.30:6379> BGSAVE

Background saving started

192.168.200.30:6379>

192.168.200.30:6379>

192.168.200.30:6379> quit

[root@666 redis_6379]# ll

total 28

-rw-r--r--. 1 root root 25869 Oct 19 02:24 redis_6379.rdb

[root@666 redis_6379]#

### 本地数据库的目录

dir /data/redis_cluster/redis_6379

save 900 1

save 300 10

save 60 10000

执行shutdown默认保存了一次

vi /opt/redis_cluster/redis_6379/conf/redis_6379.conf

#是否打开aof日志功能

appendonly yes

# 每一个都立即同步到aof

appendfsync always

#每秒写一次

appendfsync everysec

#写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof

appendfsync no

appendfilename "appendonly.aof"

两个文件都存在,aof起作用

配置文件在线修改

CONFIG GET *

等等

SortedSet(有序集合)

应用场景:

排行榜应用,取TOP N操作

这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,

这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,

每次只需要执行一条ZADD命令即可。


127.0.0.1:6379> zadd topN 0 smlt 0 fskl 0 fshkl 0 lzlsfs 0 wdhbx 0 wxg

(integer) 6

127.0.0.1:6379> ZINCRBY topN 100000 smlt

"100000"

127.0.0.1:6379> ZINCRBY topN 10000 fskl

"10000"

127.0.0.1:6379> ZINCRBY topN 1000000 fshkl

"1000000"

127.0.0.1:6379> ZINCRBY topN 100 lzlsfs

"100"

127.0.0.1:6379> ZINCRBY topN 10 wdhbx

"10"

127.0.0.1:6379> ZINCRBY topN 100000000 wxg

"100000000"


127.0.0.1:6379> ZREVRANGE topN 0 2

1) "wxg"

2) "fshkl"

3) "smlt"

127.0.0.1:6379> ZREVRANGE topN 0 2 withscores

1) "wxg"

2) "100000000"

3) "fshkl"

4) "1000000"

5) "smlt"

6) "100000"

127.0.0.1:6379>


zadd myzset 2 "two" 3 "three"       添加两个分数分别是 2 和 3 的两个成员

zrem myzset one two                 删除多个成员变量,返回删除的数量

zincrby myzset 2 one                将成员 one 的分数增加 2,并返回该成员更新后的分数

zrange myzset 0 -1 WITHSCORES       返回所有成员和分数,不加WITHSCORES,只返回成员

zrank myzset one                    获取成员one在Sorted-Set中的位置索引值。0表示第一个位置

zcard myzset                        获取 myzset 键中成员的数量

zcount myzset 1 2                   获取分数满足表达式 1 <= score <= 2 的成员的数量

zscore myzset three                 获取成员 three 的分数

zrangebyscore myzset  1 2               获取分数满足表达式 1 < score <= 2 的成员

#-inf 表示第一个成员,+inf最后一个成员

#limit限制关键字

#2  3  是索引号

zrangebyscore myzset -inf +inf limit 2 3  返回索引是2和3的成员

zremrangebyscore myzset 1 2         删除分数 1<= score <= 2 的成员,并返回实际删除的数量

zremrangebyrank myzset 0 1              删除位置索引满足表达式 0 <= rank <= 1 的成员

zrevrange myzset 0 -1 WITHSCORES        按位置索引从高到低,获取所有成员和分数

#原始成员:位置索引从小到大

     one  0  

     two  1

#执行顺序:把索引反转

     位置索引:从大到小

     one 1

     two 0

#输出结果: two  

      one

zrevrange myzset 1 3                获取位置索引,为1,2,3的成员

#相反的顺序:从高到低的顺序

zrevrangebyscore myzset 3 0             获取分数 3>=score>=0的成员并以相反的顺序输出

zrevrangebyscore myzset 4 0 limit 1 2    获取索引是1和2的成员,并反转位置索引

发布订阅

192.168.200.30:6379> PUBLISH fm5200 hello(integer) 1192.168.200.30:6379>

192.168.200.30:6379> SUBSCRIBE fm5200Reading messages... (press Ctrl-C to quit)

  1. "subscribe"
  2. "fm5200"
  3. (integer) 1
  4. "message"
  5. "fm5200"
  6. "hello"

redis事务

redis的事务是基于队列实现的。

mysql的事务是基于事务日志和锁机制实现的。

redis是乐观锁机制。


开启事务功能时(multi)

multi

command1      

command2

command3

command4

exec

discard


4条语句作为一个组,并没有真正执行,而是被放入同一队列中。

如果,这是执行discard,会直接丢弃队列中所有的命令,而不是做回滚。

exec

当执行exec时,对列中所有操作,要么全成功要么全失败


127.0.0.1:6379> set a b

OK

127.0.0.1:6379> MULTI

OK

127.0.0.1:6379> set a b

QUEUED

127.0.0.1:6379> set c d

QUEUED

127.0.0.1:6379> exec

1) OK

2) OK

9. redis乐观锁实现(模拟买票)

发布一张票

set ticket 1

窗口1:

watch ticket

multi

set ticket 0       1---->0

窗口2:

multi

set ticket 0

exec

窗口1:

exec

10、 服务器管理命令


Info

Client list

Client kill ip:port

config get *

CONFIG RESETSTAT 重置统计

CONFIG GET/SET 动态修改

Dbsize

FLUSHALL 清空所有数据

select 1

FLUSHDB 清空当前库

MONITOR 监控实时指令

SHUTDOWN 关闭服务器


关闭数据库:

redis-cli -a root shutdown

redis主从

redis(Master-Replicaset) *

原理:

1. 副本库通过slaveof 10.0.0.51 6379命令,连接主库,并发送SYNC给主库

2. 主库收到SYNC,会立即触发BGSAVE,后台保存RDB,发送给副本库

3. 副本库接收后会应用RDB快照

4. 主库会陆续将中间产生的新的操作,保存并发送给副本库

5. 到此,我们主复制集就正常工作了

6. 再此以后,主库只要发生新的操作,都会以命令传播的形式自动发送给副本库.

7. 所有复制相关信息,从info信息中都可以查到.即使重启任何节点,他的主从关系依然都在.

8. 如果发生主从关系断开时,从库数据没有任何损坏,在下次重连之后,从库发送PSYNC给主库

9. 主库只会将从库缺失部分的数据同步给从库应用,达到快速恢复主从的目的

主从数据一致性保证

min-slaves-to-write 1

min-slaves-max-lag  3

主库是否要开启持久化?

如果不开有可能,主库重启操作,造成所有主从数据丢失!

主从复制实现

1、环境:

准备两个或两个以上redis实例


mkdir /data/638{0..2}


配置文件示例:

cat >> /data/6380/redis.conf <<EOF

port 6380

daemonize yes

pidfile /data/6380/redis.pid

loglevel notice

logfile "/data/6380/redis.log"

dbfilename dump.rdb

dir /data/6380

requirepass 123

masterauth 123

EOF



cat >>   /data/6381/redis.conf <<EOF

port 6381

daemonize yes

pidfile /data/6381/redis.pid

loglevel notice

logfile "/data/6381/redis.log"

dbfilename dump.rdb

dir /data/6381

requirepass 123

masterauth 123

EOF



cat >>   /data/6382/redis.conf <<EOF

port 6382

daemonize yes

pidfile /data/6382/redis.pid

loglevel notice

logfile "/data/6382/redis.log"

dbfilename dump.rdb

dir /data/6382

requirepass 123

masterauth 123

EOF



启动:

redis-server /data/6380/redis.conf

redis-server /data/6381/redis.conf

redis-server /data/6382/redis.conf


主节点:6380

从节点:6381、6382


2、开启主从:

6381/6382命令行:


redis-cli -p 6381 -a 123 SLAVEOF 127.0.0.1 6380

redis-cli -p 6382 -a 123 SLAVEOF 127.0.0.1 6380



3、查询主从状态

redis-cli -p 6380 -a 123 info replication

redis-cli -p 6381 -a 123 info replication

redis-cli -p 6382 -a 123 info replication


相关实践学习
基于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
相关文章
|
1月前
|
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时可能遇到的问题和解决方案。
124 1
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
|
5月前
|
存储 NoSQL Redis
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
84 1
|
1月前
|
NoSQL Linux Redis
Docker学习二(Centos):Docker安装并运行redis(成功运行)
这篇文章介绍了在CentOS系统上使用Docker安装并运行Redis数据库的详细步骤,包括拉取Redis镜像、创建挂载目录、下载配置文件、修改配置以及使用Docker命令运行Redis容器,并检查运行状态和使用Navicat连接Redis。
243 3
|
1月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
30 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
1月前
|
存储 Prometheus NoSQL
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
25 3
|
5月前
|
NoSQL Java Redis
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
84 0
|
5月前
|
存储 消息中间件 缓存
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
97 0
|
5月前
|
存储 NoSQL 算法
Redis系列学习文章分享---第十篇(Redis快速入门之附近商铺+用户签到+UV统计)
Redis系列学习文章分享---第十篇(Redis快速入门之附近商铺+用户签到+UV统计)
41 0
|
5月前
|
存储 NoSQL Redis
Redis系列学习文章分享---第九篇(Redis快速入门之好友关注--关注和取关 -共同关注 -Feed流实现方案分析 -推送到粉丝收件箱 -滚动分页查询)
Redis系列学习文章分享---第九篇(Redis快速入门之好友关注--关注和取关 -共同关注 -Feed流实现方案分析 -推送到粉丝收件箱 -滚动分页查询)
65 0
|
5月前
|
消息中间件 负载均衡 NoSQL
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
73 0
下一篇
无影云桌面