Redis(一)

第一章 redis重要特性

1.速度快

Redis 所有的数据都存放在内存中
Redis 使用c语言实现
Redis 使用单线程架构/模型简单/减少因为CPU不同核数切换带来的损耗

2.基于键值对的数据结构服务器

5种数据结构:字符串,哈希,列表,集合,有序集合,地理位置

3.丰富的功能

提供了键过期功能,可以实现缓存
提供了发布订阅功能,可以实现消息系统
提供了pipeline功能,客户端可以将一批命令一次性传到 Redis,减少了网络开销

4.简单稳定

源码很少,3.0版本以后5万行左右
使用单线程模型法,使得Redis服务端处理模型变得简单
不依赖操作系统的中的类库

5.客户端语言多

java,PHP,python,C,C++,Nodejs等

6.数据持久化

把所有的数据都存在内存中
RDB和AOF

7.主从复制

8.高可用和分布式

哨兵 redis-sentinel
集群 redis-cluster 

第二章 redis应用场景

1.缓存-键过期时间

缓存session会话
缓存用户信息,找不到再去mysql查,查到然后回写到redis
商城优惠卷过期时间

2.排行榜-列表&有序集合

热度排名排行榜
发布时间排行榜

3.计数器应用-天然支持计数器

帖子浏览数
视频播放次数
商品浏览数
点赞/点踩

4.社交网络-集合

踩/赞,粉丝,共同好友/喜好,推送,打标签

5.消息队列系统-发布订阅

配合elk实现日志收集

第三章 redis安装部署

1.目录规划

/data/soft/                         #redis下载目录
/opt/redis_{PORT}/{conf,logs,pid}   #redis安装目录
/data/redis_{PORT}/redis_{PORT}.rdb #redis数据目录
/root/scripts/redis_shell.sh        #redis运维脚本

2.安装命令

1.编辑hosts文件

[root@db01 ~]# tail -3 /etc/hosts
10.0.0.51 db01    
10.0.0.52 db02    
10.0.0.53 db03

2.安装readis

yum install gcc -y
mkdir -p /data/soft
mkdir -p /data/redis_6379
mkdir -p /opt/redis_6379/{conf,pid,logs}
cd /data/soft/
wget http://download.redis.io/redis-stable.tar.gz
tar -xzvf redis-stable.tar.gz -C /opt/
ln -s /opt/redis-stable/ /opt/redis
cd /opt/redis
make && make install

3.配置文件

cat >/opt/redis_6379/conf/redis_6379.conf <<EOF
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 127.0.0.1 10.0.0.89
### 监听端口
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_6379/pid/redis_6379.pid
logfile /opt/redis_6379/logs/redis_6379.log
### 本地数据库的目录
dir /data/redis_6379
### 指定本地持久化文件的文件名,默认是dump.rdb
dbfilename redis_6379.rdb
EOF

4.启动redis

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

5.检查是否启动

ps -ef|grep redis
netstat -lntup|grep redis

6.进入redis

redis-cli

第二种源码安装方式

wget http://download.redis.io/redis-stable.tar.gz
tar -xzvf redis-stable.tar.gz
cd redis-stable
make
# 指定安装目录方式安装,我自定义安装目录,在/usr/local这个目录下建立redis文件夹
make install PREFIX=/usr/local/redis
# 将/root/redis-stable/目录下的redis.conf文件复制到/usr/local/redis/bin的目录下面
cp redis.conf /usr/local/redis/bin/

# 配置修改
在redis.conf文件里
注释 # bind 127.0.0.1 -::1
修改protected-mode no (默认yes,开启保护模式,限制为本地访问,改为no)
daemonize no(默认no,改为yes意为以守护进程方式启动,可后台运行,我后面会配置服务方式开机启动,因此不改动)
requirepass 12345678 (密码,我修改成常见的12345678)

# 新建文件redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target
 
[Service]
Type=simple
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf --supervised systemd --daemonize no
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/usr/local/redis/bin/redis-cli -p 6379 -a 12345678 shutdown
PrivateTmp=true
Restart=always
RestartSec=5
 
[Install]
WantedBy=multi-user.target

-p 6379 和 -a 12345678 是对应的端口和密码,如果没有密码,可以不用
将新建的文件放在下面的目录下面 /usr/lib/systemd/system/

# 启动方式
systemctl daemon-reload
systemctl start redis.service
netstat -lnp|grep redis
systemctl enable redis.service
ps -ef |grep redis

第四章 redis全局命令操作命令

0.写入key

set k1 v1
set k2 v2
set k3 v3

1.查看所有的key!线上禁止使用!

keys *

2.查看有多少个key,注意,是估值

DBSIZE

3.查看是否存在这个KEY

EXISTS k1
EXISTS k1 k2 k3 

状态码:
0   表示这个key不存在
1   表示这个key存在
N   表示有的N个key存在

4.删除key

DEL k1
DEL k1 k2 k3

状态码:
0   表示这个key不存在
1   表示这个key存在,并且删除成功
N   表示有的N个key存在,并且删除N个Key

5.键过期

设置过期时间
EXPIRE k1 100

取消过期时间,不修改key原来的值
PERSIST k1  

状态码:
0: 表示这个key不存在
1: 表示这个key存在,并且设置过期时间成功

查看key是否过期
TTL k1

状态码:
-1 :这个key存在,并且永不过期
-2 :这个key不存在
N  :这个key存在,并且在N秒后过期    

结论:
过期后的key直接会被删除

第五章 字符串操作

1.设置一个key

set k1 v1 

2.查看一个key

get k1 

3.设置多个key

MSET k1 v1 k2 v2 k3 v3

4.查看多个key

MGET k1 k2 k3

5.天然计数器

加1:
set k1 1
INCR k1
get k1 

加N:
INCRBY k1 100

减N:
INCRBY k1 -1 

减N:
INCRBY k1 -N

第六章 列表操作

1.插入列表:

LPUSH:从列表左侧插入数据
RPUSH:从列表右侧插入数据

LPUSH list1 A 
LPUSH list1 B 
LPUSH list1 C
RPUSH list1 D

2.查看列表的长度:

LLEN list1

3.查看列表的内容:

db01:6379> LRANGE list1 0 -1
1) "C"
2) "B"
3) "A"
4) "D"

4.删除列表元素:

LPOP: 从列表左侧删除
RPOP: 从列表右侧删除

LPOP list1 
RPOP list1

5.删除列表内容:

DEL list1

第七章 哈希类型

1.哈希:

Hash看起来就像一个hash的样子.由键值对组成
HMSET指令设置hash中的多个域
HGET取回单个域.
HMGET取回一系列的值

2.生成一个hash类型:

HMSET user:1 name xiaozhang job it age 28
HMSET user:2 name abc job it age 28
HMSET user:3 name def job it age 28

3.查看hash里的一个值

HMGET user:1 name

4.查看hash里的多个值

HMGET user:1 name age job

5.查看hash里的所有的值

HGETALL user:1

6.mysql数据和redis哈希对比:

user表

uid  name       job  age 
1    xiaozhang  it   28 
2    xiaoya     it   28 
3    xiaokai    it   28 

mysql查询数据
select * from user where id = 3

redis缓存mysql数据
名字  key1 k1值 key2 k2的值 key3 k3的值
uid:1 name xiaozahng job it age 28
uid:2 name xiaoya job it age 28
uid:3 name xiaokai job it age 28

第八章 集合与有序集合

1.创建集合

db01:6379> SADD set1 1 2 3
(integer) 3
db01:6379> SADD set2 1 3 5 7
(integer) 4

2.查看集合的成员:

db01:6379> SMEMBERS set1
1) "1"
2) "2"
3) "3"
db01:6379> SMEMBERS set2
1) "1"
2) "3"
3) "5"
4) "7"

3.查看集合的差集,以前面一个集合为基准对比后面的,前面有,后面没有则选出来

db01:6379> SDIFF set1 set2
1) "2"
db01:6379> SDIFF set2 set1
1) "7"

4.查看集合的交集

db01:6379> SINTER set1 set2
1) "1"
2) "3"
3) "5"

5.查看集合的并集

db01:6379> SUNION set1 set2
1) "1"
2) "2"
3) "3"
4) "5"
5) "7"
db01:6379> SUNION set1 set2 set3
1) "1"
2) "2"
3) "3"
4) "5"
5) "7"
6) "9"

集合不允许出现重复的值

6.删除集合数据

SREM set1 1 3
SREM set2  5 7 

==================================

有序集合

1.添加成员

zadd key score member [score member]

zadd linux6 100 banzhang
zadd linux6 99  xuewei 10 xiaohu 150 chaoyi 

2.计算成员个数

zcard linux6

3.计算某个成员分数

zscore key member 

zscore linux6 banzhang 

4.计算成员排名

zrank key member    
zrevrank key member

降序排行 zrank linux6 xuewei            
升序排行 zrevrank linux6 xuewei

5.增加成员分数

zincrby key increment member

zincrby linux6 1 xuewei 

6.返回指定排名范围的成员

zrang     key start end [wishscores]
zrevrange key start end [wishscores]

zrange linux6 0 2 withscores 

7.返回指定分数范围的成员

zrangebyscore    key min max [wishscores] [limit offect count]
zrevrangebyscore key max min [wishscores] [limit offect count]

zrangebyscore     linux6 100 200 withscores
ZREVRANGEBYSCORE  linux6 200 99 withscores

8.返回指定分数范围成员个数

zount key min max 
zcount linux6 100 200 

9.删除成员

zrem key member
zrem user:ranking oldzhang

第九章 Redis持久化

1.RDB和AOF优缺点

RDB: 快照,把当前内存里的状态快照到磁盘上
优点: 压缩格式/恢复速度快
缺点: 可能会丢失数据

AOF: 类似于mysql的binlog,重写,、每次操作都写一次/1秒写一次
优点: 安全,有可能会丢失1秒的数据
缺点: 文件比较大,恢复速度慢 

2.配置RDB

[root@db01 ~]# vim /opt/redis_6379/conf/redis_6379.conf
......
save 900 1
save 300 10
save 60 10000
dir /data/redis_6379/
dbfilename redis_6379.rdb

结论:
1.执行shutdown的时候,内部会自动执行bgsave,然后再执行shutdown
2.pkill kill killall 都类似于执行shutdown命令.会触发bgsave持久化
3.恢复的时候,rdb文件名称要和配置文件里写的一样
4.如果没有配置save参数,执行shutdown不会自动bgsave持久化 
5.如果没有配置save参数,可以手动执行bgsave触发持久化保存

常用命令:
ll /data/redis_6379/
cat /opt/redis_6379/conf/redis_6379.conf 
vim /opt/redis_6379/conf/redis_6379.conf 
pkill redis
redis-server /opt/redis_6379/conf/redis_6379.conf 
redis-cli -h db01
redis-cli -h db01 shutdown
bash for.sh 

3.配置AOF

appendfilename "redis_6379.aof"
appendonly yes
appendfsync everysec

实验:

如果aof和rdb文件同时存在,redis会如何读取:

实验步骤:
1.插入一条数据
aof: 有记录
rdb: 没有记录 
2.复制到其他地方 
3.把redis停掉
4.清空数据目录
5.把数据文件拷贝过来
aof: 有记录
rdb: 没有记录

6.启动redis

7.测试,如果有新插入的数据,就表示读取的是aof,如果没有,就表示读取的是rdb

实验结论:
如果2种数据格式都存在,优先读取aof

官方文档:
https://redis.io/topics/persistence

如何选择:

好的,那我该怎么用?
通常的指示是,如果您希望获得与PostgreSQL可以提供的功能相当的数据安全性,则应同时使用两种持久性方法。
如果您非常关心数据,但是在灾难情况下仍然可以承受几分钟的数据丢失,则可以仅使用RDB。
有很多用户单独使用AOF,但我们不建议这样做,因为不时拥有RDB快照对于进行数据库备份,加快重启速度以及AOF引擎中存在错误是一个好主意。
注意:由于所有这些原因,我们将来可能会最终将AOF和RDB统一为一个持久性模型(长期计划)。
以下各节将说明有关这两个持久性模型的更多详细信息。

第十章 Redis用户认证

redis 默认开启了保护模式,只允许本地回环地址登录并访问数据库。

禁止 protected-mode
protected-mode yes/no (保护模式,是否只允许本地访问)

1.Bind :指定 IP 进行监听

[root@db01 ~]# vim /opt/redis_6379/conf/redis_6379.conf 

bind 10.0.0.51 127.0.0.1

2.增加 requirepass {password}

[root@db01 ~]# vim /opt/redis_6379/conf/redis_6379.conf

requirepass 123456

验证方法一:

[root@db01 ~]# redis-cli -a 123456
127.0.0.1:6379> set k1 v1
OK

验证方法二:

[root@db01 ~]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> set k2 v2
OK

第十一章 禁用危险命令

配置文件里添加禁用危险命令的参数

1.禁用命令

rename-command KEYS ""
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""

2.重命名命令

rename-command KEYS "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
rename-command FLUSHALL "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
rename-command FLUSHDB "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
rename-command CONFIG "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268