redis技术1--基本介绍和操作

一.Redis介绍

1.Redis简介

1.Redis是一种基于键值对的NoSQL数据库,与很多键值对数据库不同,redis中的值可以有string,hash,list,set,zset,geo等多种数据结构和算法组成.
2.Redis会将所有的数据都放在内存中,他的读写性能非常惊人.
3.Redis可以将内存中的数据利用快照和日志的形式保存到硬盘上
4.Redis还提供了键过期,发布订阅,事务,流水线等附加功能.

2.Redis重要特性

1.速度快
Redis所有的数据都存放在内存中
Redis使用C语言实现
Redis使用单线程架构
2.基于键值对的数据结构服务器5种数据结构:字符串,哈希,列表,集合,有序集合
3.丰富的功能
提供了键过期功能,可以实现缓存
提供了发布订阅功能,可以实现消息系统
提供了pipeline功能,客户端可以将一批命令一次性传到Redis,减少了网络开销
4.简单稳定
源码很少,3.0版本以后5万行左右.
使用单线程模型法,是的Redis服务端处理模型变得简单.
不依赖操作系统的中的类库
5.客户端语言多
java,PHP,python,C,C++,Nodejs等
6.持久化
RDB和AOF
7.主从复制
8.高可用和分布式
哨兵
集群

3.Redis应用场景

1.缓存-键过期时间
缓存session会话
缓存用户信息,找不到再去mysql查,查到然后会写到redis
2.排行榜-列表&有序集合
热度排名排行榜
发布时间排行榜
3.计数器应用-天然支持计数器
帖子浏览数
视频播放次数
商品浏览数
4.社交网络-集合
踩/赞,粉丝,共同好友/喜好,推送,打标签
5.消息队列系统-发布订阅
配合elk实现日志收集

二.Redis安装部署

1.目录规划

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

2.安装命令

编辑hosts文件
[root@db01 ~]# tail -3 /etc/hosts
10.0.0.51 db01    
10.0.0.52 db02    
10.0.0.53 db03
mkdir -p /data/soft
mkdir -p /data/redis_cluster/redis_6379
mkdir -p /opt/redis_cluster/redis_6379/{
    
    conf,pid,logs}
cd /data/soft/
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar zxf redis-3.2.9.tar.gz -C /opt/redis_cluster/
ln -s /opt/redis_cluster/redis-3.2.9/ /opt/redis_cluster/redis
cd /opt/redis_cluster/redis
make (生成二进制命令)&& make install(把文件写入到/usr/local/bin)

3.配置文件说明

[root@db01 bin]# cd /opt/redis_cluster/redis
[root@db01 redis]# cd utils/
[root@db01 utils]# ./install_server.sh 

[root@db01 utils]# cd /opt/redis_cluster/redis_6379/conf/
[root@db01 conf]# ls
[root@db01 conf]# vim redis_6379.conf
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 10.0.0.51
### 监听端口
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 /data/redis_cluster/redis_6379

4.启动关闭服务

启动
[root@db01 conf]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
[root@db01 conf]# ps -ef|grep redis
root       5396      1  0 16:37 ?        00:00:00 redis-server 10.0.0.51:6379
root       5471      1  0 16:41 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:6379
root       5475   2066  0 16:41 pts/1    00:00:00 grep --color=auto redis
[root@db01 conf]# redis-cli
127.0.0.1:6379>
查看日志
[root@db01 ~]# cat /opt/redis_cluster/redis_6379/logs/redis_6379.log

问题及反思:

遇到的问题:关闭了redis进程还有,有2个redis进程
原因:在用./install_server.sh 命令时进程已经启动,但是我们又用redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf再次启动了一次,所以有2个进程
实验现象:
[root@db01 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf   
[root@db01 ~]# ps -ef|grep redis  (进程2个)
root       5527      1  0 16:52 ?        00:00:00 redis-server 10.0.0.51:6379
root       5531   2066  0 16:52 pts/1    00:00:00 grep --color=auto redis
解决办法:
第一种:
[root@db01 ~]# redis-cli -h 10.0.0.51
10.0.0.51:6379> SHUTDOWN
not connected>
[root@db01 ~]# ps -ef|grep redis   (进程只剩下了1个了)
root       5525   2066  0 16:52 pts/1    00:00:00 grep --color=auto redis
第二种:
[root@db01 ~]# redis-cli -h 10.0.0.51 shutdown
[root@db01 ~]# ps -ef|grep redis
root       5535   2066  0 16:54 pts/1    00:00:00 grep --color=auto redis

三.Redis基本操作命令

1.全局命令

Redis有5种数据结构,他们是键值对中的值,对于键来说有一些通用的命令.
1.查看所有键
Keys *  
十分危险的命令,线上禁止使用
2.查看键的总数
Dbsize 
# dbsize 命令在计算键总数时不会遍历所有键,而是直接获取Redis内置的键总数变量.
3.检查键是否存在
Exists key
# 如果键存在则返回1,不存在则返回0
4.删除键
Del key [key …]
通用命令,无论值是什么数据结构类型,del命令都可以将其删除.
5.键过期
Expire key seconds
# Redis支持对键添加过期时间,当超过过期时间后,会自动删除键.
# 通过ttl命令观察键的剩余时间
大于等于0的证书: 键剩余过期时间
-1: 键没设置过期时间
-2: 键不存在
6.键的数据类型
Type key

2.字符串

Redis并不是简单地key-value存储,实际上他是一个数据结构服务器,支持不同类型的值.
Redis Strings
这是最简单的Redis类型,如果你只用这种类型,Redis就像一个持久化的memcache服务器(注:memcache的数据仅保存在内存中,服务器重启后,数据将丢失.)
操作命令:
通常用SET command 和 GET command来设置和获取字符串值
练习:
db01:6379> set key1 value1
OK
db01:6379> get key1
"value1"
db01:6379> keys *
1) "key1"
操作命令:
INCR命令将字符串值解析成整型.将其加1,最后结果保存为新的字符串,类似命令: INCRBY,DECR,DECRBY
练习:
db01:6379> set key2 100
OK
db01:6379> get key2
"100"
db01:6379> incr key2
(integer) 101
db01:6379> get key2
"101"
db01:6379> incrby key2 10
(integer) 111
db01:6379> get key2
"111"
操作命令:
MSET和MGET可以一次存储或获取多个key对应的值.
练习:
db01:6379> mset key3 v3 key4 v4 key5 v5
OK
db01:6379> mget key3 key4 key5
1) "v3"
2) "v4"
3) "v5"
操作命令:
EXISTS命令返回1或0标识给定key的值是否存在.
使用DEL命令可以删除key对应的值,
DEL命令返回1或0标识是被删除(值存在)或者没被删除(key对应的值不存在).
练习:
db01:6379> exists key5
(integer) 1
db01:6379> del key5
(integer) 1
db01:6379> exists key5
(integer) 0
db01:6379> del key5
(integer) 0
操作命令:
Type命令可以返回key对应的存储类型
练习:
db01:6379> set key5 v5
OK
db01:6379> type key5
string
操作命令:
可以对key设置一个超时时间,当这个时间到达后被删除
练习:
db01:6379> get key5
"v5"
db01:6379> ttl key5
(integer) -1
db01:6379> expire key5 10
(integer) 1
db01:6379> ttl key5
(integer) 6
db01:6379> ttl key5
(integer) 5
db01:6379> ttl key5
(integer) 2
db01:6379> ttl key5
(integer) -2
db01:6379> ttl key5
(integer) -2
db01:6379> get key5
(nil)
操作命令:
PERSIST命令去除超时时间
练习:
db01:6379> set key5 v5 ex 10
OK
db01:6379> ttl key5
(integer) 8
db01:6379> ttl key5
(integer) 6
db01:6379> persist key5
(integer) 1
db01:6379> ttl key5
(integer) -1
注意:已经设置了过期时间的key,如果重新设置,则过期时间会消失

3.列表

操作命令:
LPUSH命令可向list的左边(头部)添加一个新元素
RPUSH命令可向list的右边(尾部)添加一个新元素.
最后LRANGE可以从list中取出一定范围的元素
练习:
db01:6379> rpush list1 A
(integer) 1
db01:6379> rpush list1 B
(integer) 2
db01:6379> lpush list1 top1
(integer) 3
db01:6379> lrange list1 0 -1
1) "top1"
2) "A"
3) "B"
db01:6379> lrange list1 1 -1
1) "A"
2) "B"
db01:6379> lrange list1 2 -1
1) "B"
操作命令:
Pop,从list中删除元素并同时返回删除的值,可以在左边或右边操作.
练习:
db01:6379> rpop list1
"B"
db01:6379> lrange list1 0 -1
1) "top1"
2) "A"
db01:6379> lpop list1
"top1"
db01:6379> lrange list1 0 -1
1) "A"
```bash


4.哈希

操作命令:
Hash看起来就像一个’hash’的样子.由键值对组成
HMSET指令设置hash中的多个域
HGET取回单个域.
HMGET取回一系列的值
练习:
db01:6379> hmset user:1000 username lsn age 27 job it
OK
db01:6379> hmget user:1000 username
"lsn"
db01:6379> hmget user:1000 username age job
1) "lsn"
2) "27"
3) "it"
db01:6379> hgetall user:1000
1) "username"
2) "lsn"
3) "age"
4) "27"
5) "job"
6) "it"
db01:6379> hmset user:1000 qq 526195417
OK
db01:6379> hgetall user:1000
1) "username"
2) "lsn"
3) "age"
4) "27"
5) "job"
6) "it"
7) "qq"
8) "526195417"

5.集合

操作命令:
集合是字符串的无序排列,
SADD指令把新的元素添加到set中
练习:
db01:6379> sadd set1 1 2 3
(integer) 3
db01:6379> smembers set1
1) "1"
2) "2"
3) "3"
和list类型不同,set集合不允许出现重复的元素
db01:6379> sadd set1 1 4
(integer) 1
db01:6379> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
Srem用来删除指定的值
db01:6379> srem set1 2 4
(integer) 2
db01:6379> smembers set1
1) "1"
2) "3"
Sdiff计算集合的差异成员
db01:6379> sadd set1 1 2 3 4
(integer) 2
db01:6379> sadd set2 1 4 5
(integer) 3
db01:6379> sdiff set1 set2  ----找第一个有的第二个没有的
1) "2"
2) "3"
Sinter计算集合的交集
db01:6379> sinter set1 set2
1) "1"
2) "4"
Sunion计算集合并集
db01:6379> sunion set1 set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

四.Redis持久化

1.实验脚本

实验脚本:
读
[root@db01 ~]# vim for.sh
#!/bin/bash
for i in {
    
    1..100000}
do
    redis-cli -h db01 set k_${i} v_${i}
done[root@db01 ~]# vim for.sh
#!/bin/bash
for i in {
    
    1..100000}
do
    redis-cli -h db01 get k_${i}
done
[root@db01 ~]# time bash for.sh
因为数据都是在内存里,重启后数据全部消失,因此引出了下面的持久化,把数据写入磁盘。

2.两种持久化方式介绍

2.1 rdb

可以在指定的时间间隔内生成数据集的 时间点快照(point-in-time snapshot)。
优点:速度快,适合于用做备份,主从复制也是基于RDB持久化功能实现的。
缺点:会有数据丢失

实验操作:
[root@db01 ~]# vim for.sh
#!/bin/bash
for i in {
    
    1..1000}
do
    redis-cli -h db01 set k_${i} v_${i}
done
[root@db01 ~]# time bash for.sh
[root@db01 ~]# redis-cli -h 10.0.0.51
10.0.0.51:6379>BSAVE   #把内存里的数据保存到磁盘里
[root@db01 ~]#pkilll redis
[root@db01 ~]#  redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
[root@db01 ~]# redis-cli -h 10.0.0.51
10.0.0.51:6379>keys *   数据存在

rdb持久化核心配置参数:
vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf
在dbfilename dump.rdb前面添加这3行:
save 900 1      #900秒(15分钟)内有1个更改就会在经过15分钟时执行BSAVE
save 300 10     #300秒(5分钟)内有10个更改在经过5分钟时执行BSAVE
save 60 10000   #60秒内有10000个更改在经过60秒时执行BSAVE
dbfilename dump.rdb
配置文件的意思是只要3个条件满足其一,就自动执行BSAVE。  

2.2 AOF

记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。
AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。
优点:可以最大程度保证数据不丢
缺点:日志记录量级比较大
注意:kill -9千万千万不要用

AOF持久化配置
vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf
在最后面添加这几行:
#是否打开aof日志功能
appendonly yes          
#每1个命令,都立即同步到
aof  appendfsync always     
#每秒写1次
appendfsync everysec 
#写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof.   
appendfsync no          
appendfilename “appendonly.aof”
注意:当aof和rdb2个文件同时存在时,会先读取aof的

问题及反思:

问题1:为什么都没有满足持久化的条件要求,这里的时间会发生改变,即是数据会自动保存
[root@db01  redis_6379]# ll /data/redis_cluster/redis_6379/redis_6379.rdb
-rw-r--r-- 1 root root 27868 Apr 18 15:02 /data/redis_cluster/redis_6379/redis_6379.rdb
[root@db01  redis_6379]# redis-cli -h db01
db01:6379> SHUTDOWN
not connected>
[root@db01  redis_6379]# ll /data/redis_cluster/redis_6379/redis_6379.rdb
-rw-r--r-- 1 root root 27877 Apr 18 15:05 /data/redis_cluster/redis_6379/redis_6379.rdb
原因:实际上在执行shutdown这条命令是执行了2条命令,一条是BGSAVE,然后才关闭
问题2:用kill -9会丢数据,用普通kill不会丢数据
原因:kill pkill  kill -15是把活干完再正常地退出流程
      kill -9是直接就退出了

3.redis 持久化方式和区别

rdb:基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能
aof:以追加的方式记录redis操作日志的文件。可以最大程度的保证redis数据安全,类似于mysql的binlog

五.Redis安全认证

redis默认开启了保护模式,只允许本地回环地址登录并访问数据库。
禁止protected-mode
protected-mode yes/no (保护模式,是否只允许本地访问)
(1)Bind :指定IP进行监听
[root@db01 ~]# vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf
bind 10.0.0.51  127.0.0.1
(2)增加requirepass {
    
    password}
[root@db01 ~]# vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf
requirepass 123456

[root@db01 redis_6379]# pkill redis
[root@db01 redis_6379]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
验证方法一:
[root@db01 ~]# redis-cli –h db01 -a 123456
127.0.0.1:6379> set k1 v1
OK
验证方法二:
[root@db01 ~]# redis-cli –h db01
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> set k2 v2
OK

猜你喜欢

转载自blog.csdn.net/xiaoleinb/article/details/113882936
今日推荐