缓存redis

缓存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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值