Redis学习笔记-阿里云开发者社区

开发者社区> 给我一碗炒粉> 正文

Redis学习笔记

简介: 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


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9591 0
Redis学习第一天
此文章为个人学习时的总结,仅供参考,不足之处望指出。
571 0
Java笔记——Redis分布式锁解决方案
我们知道分布式锁的特性是排他、避免死锁、高可用。分布式锁的实现可以通过数据库的乐观锁(通过版本号)或者悲观锁(通过for update)、Redis的setnx()命令、Zookeeper(在某个持久节点添加临时有序节点,判断当前节点是否是序列中最小的节点,如果不是则监听比当前节点还要小的节点。
1256 0
Redis入门学习
Redis安装 $ wget http://redis.googlecode.com/files/redis-2.6.13.tar.gz$ tar xzf redis-2.6.13.tar.gz$ cd redis-2.
661 0
redis学习笔记
Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 随便哪个盘,解压后,将文件夹重新命名为 redis。
890 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10852 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13301 0
Redis学习总结--《我的Java打怪日记》
个人参考以及总结的Redis知识,应对面试很好用。
11240 0
+关注
给我一碗炒粉
生之宇宙,归之殊途
35
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载