Redis入门
1. Redis 简介
1.1 Nosql
NoSQL:即 Not-Only SQL( 泛指非关系型的数据库),作为关系型数据库的补充。 作用:应对基于海量用户和海量数据前提下的数据处理问题。一种不同于关系型数据库的新型数据结构。
常见的Nosql: ⚫Redis ⚫ memcache ⚫ HBase ⚫ MongoDB
1.2 Redis特点
- redis 一种基于内存提供读写服务的Nosql数据库, 适合在系统中做缓存数据库。
- redis 具有五种数据结构,这五种数据结构都是key-value 格式的简单数据结构
- redis 虽然是单线程的,但你无需为它的性能和担忧
- redis 可以搭建集群来实现海量数据的缓存存储服务
- redis 支持两种持久化手段,RDB和AOF,一般企业中会同时开启这种方案
- redis 并不是用来取代mysql这种关系型数据库,仅仅为了解决高并发下的数据读写问题,采用redis 对MySQL表中数据进行缓存。
- redis 存储的数据可以设置过期时间,也就是我们所说的“时效性”。
1.3 Redis 应用
- redis 是解决存在高并发,大流量的手段之一,因为它具备简单的数据结构,并且基于内存存储,单线程快速访问,所以读写性能高。往往存在热点数据的系统,流量都很大。
- 场景一: 电商系统的商品详情页缓存。
- 场景二: 新浪微博-明星的博客和八卦。
- 场景三: 小学生课后辅导APP,将考试试卷进行redis缓存,因为下午6.30小学生放学后,都会做作业和考试等,存在流量高峰期。
- 场景四: 小学生课后辅导APP, 也可以有排行榜功能,使用redis 实现排行榜要比Mysql简单的多。
- 场景五… 只要存在流量的地方都可以考虑redis 来做数据的缓存。
- redis 存储的数据可以设置过期时间,所以类似短信验证码 和 Session 会话 这种有时效性的业务场景,都可以使用redis。
- redis 还可以:分布式锁,秒杀活动商品库存问题,消息队列等应用。
2. Redis 的下载与安装
2.1 下载和安装
[root@localhost ~]$ cd /itcast/install #进入到自己创建的安装目录下
#下载压缩包
[root@localhost ~]$ wget http://download.redis.io/releases/redis-5.0.0.tar.gz
#解压缩
[root@localhost ~]$ tar -zxvf redis-5.0.0.tar.gz -C /itcast/install/
#安装gcc基础环境, 可以先查看是否安装过: gcc --version
[root@localhost ~]$ yum -y install gcc
[root@localhost ~]$ yum -y install gcc-c++
#编译redis
[root@localhost ~]$ cd /itcast/install/redis-5.0.0
[root@localhost redis-5.0.0]$ make MALLOC=libc
#安装
[root@localhost redis-5.0.0]$ cd src
[root@localhost src]$ make install
#查看是否安装成功, 输入命令: "ll |grep redis-" 如果显示信息如下所示, 就是安装成功
[root@localhost src]$ ll |grep redis-
-rwxr-xr-x. 1 root root 353848 6月 26 18:30 redis-benchmark
-rw-rw-r--. 1 root root 29605 10月 17 2018 redis-benchmark.c
-rw-r--r--. 1 root root 109104 6月 26 18:30 redis-benchmark.o
-rwxr-xr-x. 1 root root 4016272 6月 26 18:30 redis-check-aof
-rw-rw-r--. 1 root root 7143 10月 17 2018 redis-check-aof.c
-rw-r--r--. 1 root root 28744 6月 26 18:30 redis-check-aof.o
-rwxr-xr-x. 1 root root 4016272 6月 26 18:30 redis-check-rdb
-rw-rw-r--. 1 root root 13541 10月 17 2018 redis-check-rdb.c
-rw-r--r--. 1 root root 65872 6月 26 18:30 redis-check-rdb.o
-rwxr-xr-x. 1 root root 771056 6月 26 18:30 redis-cli
-rw-rw-r--. 1 root root 249486 10月 17 2018 redis-cli.c
-rw-r--r--. 1 root root 871040 6月 26 18:30 redis-cli.o
-rwxr-xr-x. 1 root root 4016272 6月 26 18:30 redis-sentinel
-rwxr-xr-x. 1 root root 4016272 6月 26 18:30 redis-server
-rwxrwxr-x. 1 root root 3600 10月 17 2018 redis-trib.rb
2.2 配置文件修改
#进入到 /itcast/install/redis-5.0.0/ 目录下
[root@localhost /]$ cd /itcast/install/redis-5.0.0/
#创建配置文件的文件夹 和 数据的文件夹
[root@localhost redis-5.0.0]$ mkdir conf
[root@localhost redis-5.0.0]$ mkdir data
#将默认配置文件复制一份到conf文件夹下, 同时备份一份
[root@localhost redis-5.0.0]$ cp redis.conf conf/
[root@localhost redis-5.0.0]$ cp redis.conf conf/redis.conf.back
2.3 redis启动
#进入到 redis-5.0.0/src 目录下, 启动redis服务, &符号表示后台运行, 能够看到如下图所示,启动成功
[root@localhost redis-5.0.0]$ cd src
[root@localhost src]$ ./redis-server ../redis.conf &
9818:M 26 Jun 2020 19:02:20.243 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 5.0.0 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 9818
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
9818:M 26 Jun 2020 19:02:20.244 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
#ctrl + c 回退到命令行出, 查看进程, 如下所示就证明
[root@localhost src]$ ps -ef|grep redis
root 9818 7878 0 19:02 pts/0 00:00:00 ./redis-server 0.0.0.0:6379
root 9832 7878 0 19:02 pts/0 00:00:00 grep --color=auto redis
2.4 客户端连接
#本地连接, 如下表示连接成功
[root@localhost conf]$ redis-cli
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
#连接远程redis
[root@localhost conf]$ redis-cli –h 61.129.65.248 –p 6384
2.5 配置文件修改和再次启动
#将redis-6379.conf中的注释等都处理掉
[root@localhost redis-5.0.0]$ cd conf
[root@localhost conf]$ cat redis.conf|grep -Ev '^$|#' > redis-6379.conf
#进入到conf文件夹对redis-6379.conf文件进行修改
[root@localhost conf]$ vim redis-6379.conf
#bind 127.0.0.1 允许外网访问
#bind 0.0.0.0
bind 192.168.23.129
#后台启动
daemonize yes
#日志文件
logfile "redis-6379.log"
#数据文件夹设置
dir /itcast/install/redis-5.0.0/data
#:wq 保存退出
#关闭redis 服务
[root@localhost conf]$ ps -ef|grep redis
root 9818 7878 0 19:02 pts/0 00:00:02 ./redis-server 0.0.0.0:6379
root 10675 7878 0 19:45 pts/0 00:00:00 grep --color=auto redis
[root@localhost conf]$
[root@localhost conf]$ kill -9 9818
#再次启动并加载修改后的配置 redis-6379.conf
[root@localhost conf]$ redis-server redis-6379.conf
#查看进程是否存在, 如下启动成功
[root@localhost conf]$ ps -ef|grep redis
root 10734 1 0 19:47 ? 00:00:00 redis-server 0.0.0.0:6379
root 10739 7878 0 19:47 pts/0 00:00:00 grep --color=auto redis
[root@localhost conf]$
3. Redis 的基本操作
中文网:https://www.redis.net.cn/tutorial/3508.html
3.1 数据存储类型介绍
-
redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据类型
-
数据类型:
-
字符串类型 string
-
哈希类型 hash : map格式
-
列表类型 list : linkedlist格式。支持重复元素
-
集合类型 set : 不允许重复元素
-
有序集合类型 sortedset:不允许重复元素,且元素有顺序
-
-
当命令为验证某个数据是否存在时0为false , 1 为true
⚫ (integer) 0 → false 失败
⚫ (integer) 1 → true 成功
-
如果想清屏可以输入命令 : clear
-
如果想退出可以尝试ctrl+c
3.2 字符串类型 string
-
存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
-
存储数据的格式:一个存储空间保存一个数据
-
存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用
-
结构
key vlaue
基本命令
#1. 存储: set key value 多次set同一个key则为修改该key的value
127.0.0.1:6379> set username zhangsan
OK
#2. 获取: get key
127.0.0.1:6379> get username
"zhangsan"
#3. 删除: del key
127.0.0.1:6379> del age
(integer) 1
#4. 判定性添加数据, 如果key存在, 则不修改
127.0.0.1:6379> setnx agui zls
(integer) 1
#5. 添加/修改多个数据
127.0.0.1:6379> mset key1 value1 key2 value2
OK
#6. 获取多个数据
127.0.0.1:6379> mget key1 key2
1) "value1"
2) "value2"
#7. 获取数据字符个数(字符串长度)
127.0.0.1:6379> strlen key1
(integer) 6
#8. 追加信息到原始信息后部(如果原始信息存在就追加,否则新建)
127.0.0.1:6379> append key1 aaa
(integer) 9
127.0.0.1:6379> get key1
"value1aaa"
基本命令总结
string存储结构
数据操作 ◆ set ◆ mset ◆ del ◆ setnx ◆ append
查询操作 ◆ get ◆ mget ◆ strlen
扩展命令
#创建key为number, value为1
192.168.23.129:0>incr number
"1"
#自增+1
192.168.23.129:0>incr number
"2"
#自减-1
192.168.23.129:0>decr number
"1"
#获取number的value
192.168.23.129:0>get number
"1"
#原值上加100; incrby key increment
192.168.23.129:0>incrby number 100
"101"
#原值上减100; decrby key increment
192.168.23.129:0>decrby number 100
"1"
#设置数据具有指定的生命周期, 默认没有过期时间
#setex key seconds value 单位秒
#psetex key milliseconds value 单位毫秒
#name zhagnsan 10秒过期
192.168.23.129:0>setex name 10 zhangsan
"OK"
#name zhagnsan 10秒过期
192.168.23.129:0>setex name 10000 zhangsan
"OK"
string 类型注意事项
- 数据未获取到时,对应的数据为(nil),等同于null
- 数据最大存储量:512MB
- string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算
- 按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis 数值上限范围,将报错 9223372036854775807(java中Long型数据最大值,Long.MAX_VALUE)
- redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响
扩展命令总结
⚫ 数值操作 ◆ incr ◆ incrby ◆ incrbyfloat ◆ desc ◆ descby
⚫ 时效性操作 ◆ setex ◆ psetex
应用场景
-
明星的新浪微博主页的粉丝数量和博客数量
-
在redis中为明星设定用户信息,以用户主键和属性值作为key,后台设定定时刷新策略即可
#id为3506728370的明星用户 粉丝数量 200个 192.168.23.129:0>set user:id:3506728370:fans 200 "OK" #id为3506728370的用户 博客数量 100个 192.168.23.129:0>set user:id:3506728370:blogs 100 "OK"
-
也可以使用json格式保存数据
192.168.23.129:0>set user:id:3506728371 '{"fans":12210947, "blogs":6164,"focuses":83}'
"OK"
key 的设置约定
数据库中的热点数据key命名惯例
表名 | 主键名 | 主键值 | 字段名 |
---|---|---|---|
order | id | 29437595 | pay_status |
equip | id | 390472345 | type |
news | id | 202004150 | title |
#存储订单的支付状态
192.168.23.129:0>set order:id:29437595:pay_status 已支付
"OK"
#获取
192.168.23.129:0>get order:id:29437595:pay_status
"已支付"
3.3 哈希类型 hash
-
新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
-
需要的存储结构:一个存储空间保存多个键值对数据
-
hash类型:底层使用哈希表结构实现数据存储
-
结构
key filed1 value1
filed2 value2
… …
基本命令
#添加/修改数据 hset key field value
localhost:0>hset zhangsan name '张三'
"1"
localhost:0>hset zhangsan age 23
"1"
#获取数据 hget key field hgetall key
localhost:0>hget zhangsan name
"张三"
localhost:0>hget zhangsan age
"23"
localhost:0>hgetall zhangsan
1) "name"
2) "张三"
3) "age"
4) "23"
localhost:0>
#删除数据 hdel key field1 [field2]/ del key
localhost:0>hdel zhangsan name
"1"
#删除整个hash key
localhost:0>del zhangsan
"1"
#设置field的值,如果该field存在则不做任何操作 hsetnx key field value
localhost:0>hset zhangsan name '张三'
"1"
localhost:0>hsetnx zhangsan name '张三'
"0"
localhost:0>
#添加/修改多个数据
#hmset key field1 value1 field2 value2 …
localhost:0>hmset localhost:0>lisi name