一、Redis概念
1.1 Redis简介
Redis是缓存中间件,常见的中间件有
-
nginx web服务
-
php 转发动态请求
-
Tomcat 既是web页面,也可以转发动态请求。
-
springboot 自带Tomcat功能
Redis作为缓存中间件,作用是缓存数据库,减轻数据库的压力。
所有的关系型数据库都不支持高并发,一旦访问量激增,数据库很快就会崩溃。
而Redis除了是缓存工具以外,也是数据库。
Redis是非关系型数据库,nosql :not only sql ,不仅仅是sql。
键值对形式:key value,和mysql不一样,数据的类型不是定义好的类型,Redis会自动识别,默认的类型都是string
1.2 Redis相关概念
Redis :远程字典服务器,键值对形式。
是开源的,C语言写的nosql数据库。Redis是基于内存运行,所有的数据不是保存在硬盘,而是内存中。
Redis的持久化:定期或人为地把数据保存到硬盘。
Redis的优点:
-
极高的读写速度。读速度可以达到11万次/秒,写速度可以到8.1万次/秒。
-
支持丰富的数据类型,键值对可以定义多种数据类型,string list hash set等
-
支持数据持久化,内存当中的数据可以保存到磁盘
-
原子性,Redis的所有操作都是原子性的
-
支持主从模式和高可用模式(哨兵)以及集群
Redis是基于内存运行的数据库,主要的应用场景就是缓存。除此之外,其他的应用场景有:排行榜,计数器,存储关系,实时分析记录,日志系统等。
缓存的概念:
缓存时一种用于存储临时数据副本的技术。目的就是提高访问速度和性能。
缓存通常位于数据的访问路径上,即数据的必经之路上。客户端可以在不直接访问原始数据的情况下,可以直接获取数据。
缓存的应用场景:
-
web缓存
-
数据库缓存
-
对象缓存:主要是大数据应用,开发应用
1.3 部署安装redis
使用5.0.7版本的tar包部署安装Redis
#安装依赖环境
yum -y install gcc gcc-c++ make
#解压缩安装包
tar -xf redis-5.0.7.tar.gz
cd redis-5.0.7/
#编译
make -j 4
#安装
make PREFIX=/usr/local/redis install
## PREFIX= 指定安装目录
#安装组件
cd utils
./install_server.sh
##运行之后四次回车。默认选择
##默认端口6379
##默认配置文件
##默认日志文件
##默认数据保存目录
##第五个选项要自定义执行目录(手动输入)
##/usr/local/redis/bin/redis-server
##然后再回车
#创建软连接
ln -s /usr/local/redis/bin/* /usr/local/bin
#查看服务状态
netstat -antp | grep 6379
#修改服务配置
vim /etc/redis/6379.conf
#70行
bind 127.0.0.1 20.0.0.51
##绑定端口到网卡的IP地址
#93行 :默认端口号,不动、
#137行 :daemonize yes 开启后台运行,不动
#159行 :pid文件,不动
#167行 :日志级别,不动
#对redis服务进行控制: restart|status|stop
/etc/init.d/redis_6379 restart|status|stop
#查看启动日志
vim /var/log/redis_6379.log
1.4 Redis的命令行工具
登录redis:
redis-cli -h 20.0.0.51 -p 6379
-
redis-cli :命令行工具,以下是其他命令行工具
-h <hostname>
:指定连接的 Redis 服务器主机名或 IP 地址。-p <port>
:指定连接的 Redis 服务器端口号。-a <password>
:指定连接的 Redis 服务器密码。-n <db>
:指定要连接的 Redis 数据库编号。
-
redis-server :start|stop|restart 控制redis
-
redis-benchmark :检测redis运行效率
- -c :向redis的主机模拟发送并发连接的个数
- -n :每个连接同时发送请求测试的个数
- -q :静默模式,即只输出最终的统计结果,不显示详细的请求/响应信息。
- -d :指定测试的数据大小,单位是字节,默认为 3 字节
-
redis-check-aof :修复aof持久化的文件
-
redis-check-rdb :修复rdb持久化的文件
二、redis常用命令
2.1 基础数据类型
string
:字符串list
:列表型hash
:散列,键值对集合set
:集合,不重复的无序集合zset
:集合,有序集合
2.2 基础的操作
redis-cli -h 20.0.0.51 -p 6379
#创建键值对
set key value
## key:键名; value:值
set test1 10
set test2 20
set test3 30
set test4 40
#获取数据,通过key获取数据:
get key
get test1
#查看key
KEYS key
KEYS *
##查看当前库全部的key
KEYS test1
#查看key是否存在
exists key
exists test1
##返回 integer 值为1,表示存在
#对已有的键值对set,会重定义key的value
set key value
set test1 100
#查看key对应的value的类型
type key
type test1
#删除key:
del key [key ...]
del test1
del test2 test3
##返回integer,删了几个返回值就为几
#重命名key
rename key newkey
rename test4 test004
#设置密码 为123456
config set requirepass 123456
#使用密码认证
auth 123456
config get requirepass
三、数据类型的细化操作
3.1 string类型
string类型是redis的基础类型,最大能够存储512Mb的数据。
对数据进行扩写(追加)
#对key已有的value值进行追加(扩写)
append key value
##返回integer的值为value的值的长度
set test1 abc
append test1 defg
#返回integer为7
get test1
#返回test1的值为abcdefg
strlen key
#获取key对应的值的长度
整数的自增或自减,默认步长1
#自增1 :incr : increase
incr key
#自减1 :decr :decrease
decr key
#指定增加/减少的量
incrby key $$
decrby key $$
# $$ 为增加/减少的具体的量
快速设置键值对的生命周期
setex key seconds value
##seconds的值为生命周期ttl,单位秒
#查看key的生命周期ttl
ttl key
#返回integer的值即为剩余生命时间,单位秒
setex是set 和 expire 的结合用法,对spring数据类型设置TTL简洁且高效。
expire和expireat 设置生命周期
EXPIRE:
-
用于设置键的生存时间(TTL),单位为秒。在指定的秒数后,键会自动被删除。
-
示例:
EXPIRE key seconds
其中key是要设置生命周期的键名,seconds是生存时间(秒数)。
EXPIREAT:
-
与
EXPIRE
类似,但是它接受一个 UNIX 时间戳作为参数,表示键的过期时间点。在指定的时间点后,键会自动被删除。 -
示例:
EXPIREAT key timestamp
key是要设置生命周期的键名,timestamp是 UNIX 时间戳。
选库/切库
Redis有一共16个库,编号从0-15
#查看库中键值对数量
dbsize
#查看库的数量
config get databases
#切换库
select $$
##$$为库的编号,每个库都是独立的,每个库互不影响
#复制库的key到其他库
move key $$
##key为复制的key,$$是复制到的库的编号
#清除当前库的缓存,慎用!!!
flushdb
#清除全部库的缓存,慎用!!!
flushall
创建多个键值对
mset key1 value1 key2 value2 key3 value3
查看多个键值对
mget key1 key2 key3
3.2 list类型
列表,一个表中有多个值
LPUSH key value [value ...]
##列表中值的索引index是按插入顺序从后向前排的,从0开始
##后插入的value对应的index靠前
RPUSH key value [value ...]
##列表中值的索引index是按插入顺序从前向后的,从0开始
##先插入的value对应的index靠前
#查看列表内容
lrange key start stop
##stop是起始索引位置,stop是结束索引位置
lrange key 0 -1
##stop 处的-1表示最后一位
#向list中添加数据,从头部开始插入,新插入的数据编号是0
lpushx key value
#向list中添加数据,从尾部开始插入,新插入的数据编号是最后一位
rpushx key value
#从list中移除数据
lpop key
##默认移除索引0的值
rpop key
##默认移除索引最后一位的值
#查看列表的长度
llen key
#从列表中指定删除
lrem key $$ value
## $$是删除指定值的次数
#删除列表
del key
#查看列表指定索引的值
lindex key $index
## $index的值为索引的序号,可以查看指定索引的值
#对指定索引编号的值进行修改
lset key $index value
#在指定的表的指定的值前一位索引插入值
linsert key before value1 value2
##在最新的value1前一个索引位置插入value2
#在指定的值后一位索引插入值
linsert key after value1 value2
##在最新的value1后一个索引位置插入value2
3.3 hash类型
散列,用来存储一个键值对集合。其中键是唯一的 ,对象类别和ID构成键名
hash存储的空间很小,占用的内存和持久化后的磁盘空间占用都很小
#创建hash键
hset key field value [field value ...]
## field:对象; value:值
#获取hash值
hget key field
可以看到hash是一个键值对包含多个对象和对象的值。
一个key就是一个hash值,对象field的名称不能重复
#查看hash键的长度(对象的个数)
hlen key
#删除hash键的对象
hdel key field
对多个对象和值的操作
#创建多个对象和值
hmset key field value [field value ...]
#获取多个对象的值
hmget key field [field ...]
hgetall key
#只查看对象名
hkeys key
#只查看对象的值
hvals key
注意:hset和hmset虽然都可以同时对多个对象进行设置,但二者仍存在区别。
- hset返回的integer值为0,表示对对象的值进行了覆写或更新,返回integer为1,表示创建并写入了新的值。对多个对象的操作是分开进行的,返回的值相加。
- hmset是一次性设置多个字段及其对应的值,要么都成功,要么都失败且没有更改,这样可以确保原子性。当设置都成功,会直接返回OK。
仅当字段不存在时,设置字段的值:
#向hash键中添加对象和值
hsetnx key field key
##注意,这里的field不能是已存在的field,否则无法添加
3.4 set集合
set集合是无序集合,元素类型只能是string,无序集合中元素具有唯一性,不允许重复。
应用场景:可以用set的数据来追踪唯一性的数据。比如IP地址,或者根据客户ID区分不同客户购买的同一产品。
#创建无序集合/添加值
sadd key value [value ...]
## value值重复则无效
#查看set集合内容
smembers key
#获取set集合元素的数量
scard key
#从set集合中随机获取一个值
srandmember key
#从set集合中随机删除一个值
spop key
#从set集合中制定删除值
srem key value [value ...]
#剪切set集合的值到另一个set集合
smove key1 key2 value
##把key1集合的值value剪切到key2集合中去,只能移一个值
3.5 zset集合
zset (sorted set) 是有序集合,元素类型都是string,元素唯一,不能重复。
每个元素都会关联一个double类型的score(权重),通过score的大小进行排序。权重可以相同。
#创建有序集合/添加值
zadd key score value [score value ...]
#排序/展示成员
zrange key start stop
##默认按照从小到大的权重排列
##start 和 stop 是展示的起始位置和结束位置索引的编号
#反向排序
zrevrange key start stop
##按照从大到小的权重排序,
#排序并展示成员权重
zrange key start stop withscores
#按照权重范围取值
zrangebyscore key min max
##展示权重 min<= score <=max 的所有值
3.6 总结
-
string :字符串
-
list :列表型,一个表中有多个值
-
hash :散列,键值对集合,一个键中有多个对象,每个对象对应一个值,对象的名称不能重复,值可以重复
-
set :集合,不重复的无序集合。一个集合中有多个值,值不能重复
-
zset :集合,不重复的有序集合。值有权重,权重可以相同。