缓存redis
缓存的统称是:NoSql
第一部分:缓存数据库的对比
Memcached:分布式的多核多线程的缓存数据,遗憾的是Memcache只支持key=value这种数据类型,当访问大且缓存数据量多的时候,抖动比较大。
Redis:单核单线程的缓存数据, 支持多种数据类型(字符串、列表、集合、有序集合)
1.Memcached:分布式的多核多线程的缓存数据,遗憾的是Memcache只支持key=value这种数据类型,当访问大且缓存数据量多的时候,抖动比较大。
什么叫抖动:意思讲延迟大多数很快,突然很慢的情况
2.Redis:单核单线程的缓存数据, 支持多种数据类型(字符串、列表、集合、有序集合)特别注意:Redis6.0版本以后支持开始多线程了.但Redis可以用多实例解决单核单线程的问题
记住:
1.Redis不处理数据,是我们处理好数据以后放在缓存
2.redis 不支持Windows系统
redis特性
透明性:分布式系统对用户来说是透明的,一个分布式系统在用户面前的表现就像一个传统的单处理机分时系统,可让用户不必了解内部结构就可以使用。
扩展性:分布式系统的最大特点就是可扩展性,他可以根据需求的增加而扩展,可以通过横向扩展使集群的整体性能得到线性提升,也可以通过纵向扩展单台服务器的性能使服务器集群的性能得到提升。
可靠性:分布式系统不允许单点失效的问题存在,它的基本思想是:如果一台服务器坏了,其他服务器接替它的工作,具有持续服务的特性。
高性能:高性能是人们设计分布式系统的一个初衷,如果建立了一个透明,灵活,可靠的分布式系统,但他运行起来像蜗牛一样慢,那这个系统就是失败的。
两种现象:
雪崩:短期内,大量缓存失效,导致请求都去数据库要数据,导致数据库压力突然变大就叫雪崩
击穿:就是大量携带莫名其妙的请求到缓存,缓存没有,统统交给数据库,导致数据库压力突然变大
第二部分:编译安装安装Redis
[root@jenkins01 opt]# wget https://download.redis.io/releases/redis-6.0.9.tar.gz
[root@jenkins01 opt]# ll
-rw-r--r-- 1 root root 2261418 10月 27 2020 redis-6.0.9.tar.gz
[root@jenkins01 opt]#tar -xf redis-6.0.9.tar.gz -C /usr/local
[root@jenkins01 local]# cd redis-6.0.9/
[root@jenkins01 redis-6.0.9]# ll ###看到Makefile就知道需要编译安装
总用量 292
-rw-rw-r-- 1 root root 108806 10月 27 2020 00-RELEASENOTES
-rw-rw-r-- 1 root root 51 10月 27 2020 BUGS
-rw-rw-r-- 1 root root 2499 10月 27 2020 CONTRIBUTING
-rw-rw-r-- 1 root root 1487 10月 27 2020 COPYING
drwxrwxr-x 6 root root 192 4月 29 19:00 deps
-rw-rw-r-- 1 root root 11 10月 27 2020 INSTALL
-rw-rw-r-- 1 root root 151 10月 27 2020 Makefile
-rw-rw-r-- 1 root root 6888 10月 27 2020 MANIFESTO
-rw-rw-r-- 1 root root 21099 10月 27 2020 README.md
-rw-rw-r-- 1 root root 84841 10月 27 2020 redis.conf
-rwxrwxr-x 1 root root 275 10月 27 2020 runtest
-rwxrwxr-x 1 root root 280 10月 27 2020 runtest-cluster
-rwxrwxr-x 1 root root 795 10月 27 2020 runtest-moduleapi
-rwxrwxr-x 1 root root 281 10月 27 2020 runtest-sentinel
-rw-rw-r-- 1 root root 10744 10月 27 2020 sentinel.conf
drwxrwxr-x 3 root root 8192 4月 29 19:01 src
drwxrwxr-x 11 root root 182 10月 27 2020 tests
-rw-rw-r-- 1 root root 3055 10月 27 2020 TLS.md
drwxrwxr-x 9 root root 4096 10月 27 2020 utils
##安装依赖
[root@jenkins01 redis-6.0.9]# yum -y install centos-release-scl
##安装依赖
[root@jenkins01 redis-6.0.9]# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
[root@jenkins01 redis-6.0.9]# scl enable devtoolset-9 bash
##多线程编译
[root@tomcat redis]# make -j
##安装到/usr/local/redis
[root@tomcat redis]# make PREFIX=/usr/local/redis install
###找到/usr/local/redis
[root@jenkins01 redis]# mkdir conf
[root@jenkins01 redis]# mv /usr/local/redis-6.0.9/redis.conf ./conf
[root@jenkins01 redis]# cd /bin/
###出现下面内容代表安装Redis成功
[root@jenkins01 bin]# ./redis-server /usr/local/redis/conf
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 6.0.9 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 10474
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
##或者我们用命令实验一下,说明成功了
[root@jenkins01 bin]# ./redis-cli
127.0.0.1:6379>
第三部分:容器安装Redis
1.具体yaml文件
# 容器安装
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: redis-deployment
spec:
selector:
matchLabels:
app: redis
deploy: redis
template:
metadata:
labels:
app: redis
deploy: redis
spec:
containers:
- name: redis
image: redis:6.0.9
---
kind: Service
apiVersion: v1
metadata:
name: redis-deployment-svc
spec:
ports:
- port: 6379
targetPort: 6379
name: redis
protocol: TCP
selector:
app: redis
deploy: redis
type: NodePort
2.源码编译安装的Redis连接一下我们容器化安装的Redis
[root@jenkins01 bin]# ./redis-cli -h 192.168.15.31 -p 31114
192.168.15.31:31114>
3.使用systemctl管理redis
##修改system配置文件
[root@jenkins01 bin]# vim /usr/local/redis/conf/redis.conf
[Unit]
Description=Redis
After=network.target
[Service]
Type=forking
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf ##绝对路径
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
##上面安装成功后,需要修改redis下面的配置文件
[root@jenkins01 bin]# vim /usr/local/redis/conf/redis.conf
daemonize no 改为 yes
##执行命令,看的出安装成功!
[root@jenkins01 bin]# systemctl daemon-reload
[root@jenkins01 bin]# systemctl restart redis
[root@jenkins01 bin]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 11089/redis-server
##再添加环境变量
PATH=$MAVEN_HOME:$PATH:$GRAFANA_NAME/bin:$ALERTMANAGER:$REDISHOME/bin
export REDISHOME=/usr/local/redis
export PATH
[root@jenkins01 redis]# source /etc/profile
##环境变量设置成功,就不用再去/usr/local/redis/bin/去操作命令了,也不用执行时候还要带配置文件了
[root@jenkins01 ~]# redi
rediff redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server
redis数据结构
1.字符串定义
Redis的String类型可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。
2.修改Redis密码
##修改配置文件
[root@jenkins01 ~]# vi /usr/local/redis/conf/redis.conf
# requirepass foobared
requirepass 123
[root@jenkins01 ~]# systemctl restart redis
[root@jenkins01 ~]# redis-cli
127.0.0.1:6379> set a b
(error) NOAUTH Authentication required.
#密码登录;成功
[root@jenkins01 ~]# redis-cli -a 123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379>
3.解决中文乱码问题
[root@jenkins01 ~]# redis-cli --raw
127.0.0.1:6379> auth 123
OK
127.0.0.1:6379> get name
令º正
4.字符串的增删改查
# 添加
127.0.0.1:6379> set name 陈阳
OK
# 获取
127.0.0.1:6379> get name
陈阳
# 修改
127.0.0.1:6379> set name 阳哥
OK
127.0.0.1:6379> get name
阳哥
# 删除
127.0.0.1:6379> DEL name
1
127.0.0.1:6379> get name
5. nx ,xx 以及他们的合并(xx没有合并的资料估计不行。实验也保错了)
##nx 表示存在不用管,不存在就创建
127.0.0.1:6379> get name
yuheiyang
127.0.0.1:6379> set name shanghai1 nx
127.0.0.1:6379> get name
yuheiyang
127.0.0.1:6379> get name
yuheiyang
127.0.0.1:6379> set name shanghai nx
空------空
##xx 表示如果value值存在则更新为新的,不存在吧 不管
127.0.0.1:6379> get name
yuheiyang
127.0.0.1:6379> set name shanghai xx
OK
127.0.0.1:6379> get name
shanghai
总结实验:
127.0.0.1:6379> del name
1
127.0.0.1:6379> get name
127.0.0.1:6379> setnx name shanghai
1
127.0.0.1:6379> setxx name guangzhou
ERR unknown command `setxx`, with args beginning with: `name`, `guangzhou`,
127.0.0.1:6379> set name guangzhou xx
OK
127.0.0.1:6379> get name
guangzhou
6.exists 查看key是否存在,返回true / false(1/0)
# 判断一个key,是否存在
127.0.0.1:6379> get name
guangzhou
127.0.0.1:6379> del name
1
127.0.0.1:6379> get name
127.0.0.1:6379> set name shanghai
OK
127.0.0.1:6379> get name
shanghai
127.0.0.1:6379> exists name
1
7.ttl 查看数据过期时间
# 过期时间
127.0.0.1:6379> TTL name
-1 # 永久不过期
127.0.0.1:6379> TTL name
-2 # 已经过期了
127.0.0.1:6379> TTL name
5 # 剩下5秒钟就过期了
8.设置过期时间(单位分别为秒和毫秒)
# 设置一个以秒为单位的过期时间 合并set和ex setex
# 设置一个以毫秒为单位的过期时间 合并set和px 为psetex
# 设置一个以秒为单位的过期时间 合并set和ex
原版:
127.0.0.1:6379> set name chenyang ex 10
OK
合并版:
127.0.0.1:6379> setex name2 10 chenyang
OK
127.0.0.1:6379> ttl name2
8
127.0.0.1:6379> ttl name2
6
127.0.0.1:6379> ttl name2
5
127.0.0.1:6379> ttl name2
4
127.0.0.1:6379> ttl name2
3
127.0.0.1:6379> ttl name2
2
127.0.0.1:6379> ttl name2
# 设置一个以毫秒为单位的过期时间 合并set和px 为psetex
1秒=1000毫秒
原版:
127.0.0.1:6379> set name shanghai px 10000
OK
合并版:
127.0.0.1:6379> psetex name3 10000 shanghai
OK
127.0.0.1:6379> ttl name3
7
127.0.0.1:6379> ttl name3
6
127.0.0.1:6379> ttl name3
4
127.0.0.1:6379> ttl name3
4
127.0.0.1:6379> ttl name3
3
127.0.0.1:6379> ttl name3
1
127.0.0.1:6379> ttl name3
-2
9.设置多个值并
127.0.0.1:6379> mset country china city shanghai zone qingpu
OK
127.0.0.1:6379> keys *
name
name1
city
zone
country
127.0.0.1:6379> get country
china
127.0.0.1:6379> get city
shanghai
127.0.0.1:6379> get zone
qingpu
10.getset 命令先get到 再set命令
127.0.0.1:6379> get name
guangzhou
127.0.0.1:6379> getset name shanghai
guangzhou
127.0.0.1:6379> get name
shanghai
127.0.0.1:6379> ttl name
-1
11 按照下表去更新
127.0.0.1:6379> set name shanghai
OK
127.0.0.1:6379> get name
shanghai
127.0.0.1:6379> setrange name 8 huangpuqu
17
127.0.0.1:6379> get name
shanghaihuangpuqu
12 key * 获取多个key值(生产环境慎用)
127.0.0.1:6379> keys *
name
ex
name1
city
zone
country
13.获取指定字段key的value值
127.0.0.1:6379> mget get country city zone
china
shanghai
qingpu
14.getrange截取指定位置的value值
127.0.0.1:6379> get name
shanghaihuangpuqu
127.0.0.1:6379> getrange name 3 -1
nghaihuangpuqu
127.0.0.1:6379> getrange name 1 3
han
15.计数:redis当中的计数器是具有原子性的:incr (递增) decr(递减) incrby + 步长 decrby+步长
127.0.0.1:6379> incr num
3
127.0.0.1:6379> incr num
4
127.0.0.1:6379> incr num
5
127.0.0.1:6379> incrby num 10
15
127.0.0.1:6379> incrby num 10
25
127.0.0.1:6379> incrby num 10
35
127.0.0.1:6379> decrby num 10
25
127.0.0.1:6379> decrby num 10
15
127.0.0.1:6379> decrby num 10
5
16.append 追加
127.0.0.1:6379> get name
shanghaihuangpuqu
127.0.0.1:6379> append name 666
20
127.0.0.1:6379> get name
shanghaihuangpuqu666
Redis数据结构之哈希
需求:如何用一个key存一个人的信息?(字符串需要多个key)
1.用一个key存一个人的数据
127.0.0.1:6379> hset person name chenyang sex man addr shanghai
3
127.0.0.1:6379> get person
WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> hget person name
chenyang
127.0.0.1:6379> hget person sex
man
127.0.0.1:6379> hget person addr
shanghai
2.增删改查
##修改一个数据
127.0.0.1:6379> hget person name
chenyang
127.0.0.1:6379> hset person name xiaoyangyang
0
127.0.0.1:6379> hget person name
xiaoyangyang
##删除一个数据
127.0.0.1:6379> hget person name
xiaoyangyang
127.0.0.1:6379> hdel person name
1
127.0.0.1:6379> hget person naem
##删除整个shuju
127.0.0.1:6379> del person
1
127.0.0.1:6379> get person
空
127.0.0.1:6379> hget person name
空
127.0.0.1:6379> hget person sex
空
##设置一个key统领一组子key和value
127.0.0.1:6379> hset person contry china city shanghai zone huangpuqu
3
127.0.0.1:6379> hget person contry city zone
ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> hmsget person contry city zone
ERR unknown command `hmsget`, with args beginning with: `person`, `contry`, `city`, `zone`,
##获取时候要用到hmget 命令
127.0.0.1:6379> hmget person contry city zone
china
shanghai
huangpuqu
##
127.0.0.1:6379> hset meiguo cuntry usa city luoshanji zon jinshanqu
3
127.0.0.1:6379> hmget meiguo
ERR wrong number of arguments for 'hmget' command
127.0.0.1:6379> hmget meiguo cuntry city
usa
luoshanji
127.0.0.1:6379> hmget meiguo cuntry city zon
usa
luoshanji
jinshanqu
###hgetall 代表获取所有的数据(包括key value)
127.0.0.1:6379> hgetall meiguo
cuntry
usa
city
luoshanji
zon
jinshanqu
##获取所有的key值
127.0.0.1:6379> hkeys meiguo
cuntry
city
zon
##获取所有的value值
127.0.0.1:6379> hvals meiguo
usa
luoshanji
jinshanqu
3.hincrby 递增或者递减
127.0.0.1:6379> hincrby meiguo id 1
1
127.0.0.1:6379> hincrby meiguo id 1
2
127.0.0.1:6379> hincrby meiguo id 1
3
127.0.0.1:6379> hincrby meiguo id 1
4
127.0.0.1:6379> hincrby meiguo id 1
5
127.0.0.1:6379> hincrby meiguo id 1
6
127.0.0.1:6379> hincrby meiguo id -1
5
127.0.0.1:6379> hincrby meiguo id -1
4
127.0.0.1:6379> hincrby meiguo id -1
3
127.0.0.1:6379> hincrby meiguo id -1
2
127.0.0.1:6379> hincrby meiguo id -1
1
127.0.0.1:6379> hincrby meiguo id -1
0
127.0.0.1:6379> hincrby meiguo id -1
4. hincrbyfloat 浮点数增加、减少
127.0.0.1:6379> hincrbyfloat meiguo num 0.99
0.99
127.0.0.1:6379> hincrbyfloat meiguo num 0.99
1.98
127.0.0.1:6379> hincrbyfloat meiguo num 0.99
2.97
127.0.0.1:6379> hincrbyfloat meiguo num 0.99
3.96
127.0.0.1:6379> hincrbyfloat meiguo num -0.99
3.96
127.0.0.1:6379> hincrbyfloat meiguo num -0.99
2.97
127.0.0.1:6379> hincrbyfloat meiguo num -0.99
1.98
127.0.0.1:6379> hincrbyfloat meiguo num -0.99
0.99
127.0.0.1:6379> hincrbyfloat meiguo num -0.99
0
5.获取哈希字符串的长度
127.0.0.1:6379> hstrlen meiguo country
0
127.0.0.1:6379> hstrlen meiguo city
9
6. 设置过期时间
# 设置过期时间
127.0.0.1:6379> EXPIRE people 12345
1