Redis
Remote Dictionary Service即远程字典服务
一个基于内存的key-value结构数据库,在开发中常常作为缓存存储不经常被改变的数据
基于内存存储,读写性能高
在企业中应用广泛
Redis介绍
用C语言开发的开源高性能键值对数据库,可以达到10w+的qps,可以存储丰富的value类型,被称为结构化的nosql数据库
Nosql:(Not Only Sql),泛指非关系型数据库(数据和数据之间没有联系)
是关系型数据库的补充
关系型数据库(RDBMS)
Mysql
Oracle
DB2
SQLServer
非关系型数据库(NoSql)
Redis
Mongo db
MemCached
Redis的作用
数据缓存:将数据缓存到redis中
消息队列
…
Redis的启动
前端模式启动(不使用)
直接运行bin/redis-server,缺点是启动完成后不能再进行任何操作除非使用ctrl+c退出
后端模式(推荐)
先修改redis.conf配置文件,修改daemonize 为yes
daemonize:后台运行
在启动时指定配置文件运行
./redis-server redis.conf
redis启动客户端
./redis-cli
Redis的终止
在redis客户端中输入
shutdown
Windows中Redis的启动和终止(仅了解)
直接打开redis-server.exe启动redis服务
默认端口号为6379
ctrl+c停止服务
打开redis-cli.exe启动redis客户端,默认连接本地Redis服务,且不需要认证即可连接成功
使用可视化工具连接redis服务器端
redis-desktop-manager
安装过程略,端口号默认6379
如果需要允许其他机器进行访问需要配置redis.conf进行内容配置
添加当前linux局域网的ip地址
切换redis数据库
select 数据库索引
注:一个redis服务器中可以包含多个数据库,客户端可以只连接Redis中的某个数据库
Redis中有db0-db15的16个数据库,不能被删除也不能新建,数据库中没有表结构,客户端默认连接第0个数据库
Redis的数据类型
redis的value支持五种数据类型
key必须为String类型,用以表示存储的数据
命名规则:
不能太长避免查询效率低
不能太短避免重复
value支持五种数据类型,表示存储的数据
string:字符串
hash:键值对
list:列表类型,存取有序,可以重复
set:集合类型,存取无需,不可重复
sorted set/zset :有序集合类型,每个元素有一个分数用以决定顺序
string类型
Redis中最基础的数据类型
字符串,整数,浮点类型都以字符串写入
最多容纳512m
常用命令
set 键 值
//添加或修改一个键值对
get 键
//根据键获取值,不存在返回nil(c语言中的null)
del 键
//删除指定键值对,返回删除个数
SETEX key seconds value
//设置指定key的值,将key的过期时间设为seconds秒,
//即SET key value ex seconds
EXPIRE key seconds
//如果一个key存在,设置过期时间
SETNX key value/set key value nx
//保存键值对,如果key存在则不保存
mset name lisi addr sh
批量添加name为lisi addr为sh
mget name age addr
批量获取name,age,addr的值
del name age
批量删除name age
hash类型操作命令
Redis中的hash类型可以看成键值均为String类型的Map容器
每个Hash中可以保存2^32-1个键值对
常用命令
hset 键 字段 值
//添加键,字段,值
hget 键 字段
//通过键,字段得到值
hmset 键 字段 值 字段 值
//multiply多个,一次添加多个字段和值
hmget 键 字段 字段
//通过键,获取多个字段和值
hdel 键 字段 字段
//删除一个或多个字段的值
hgetall 键
//得到这个键下所有的字段和值
HKEYS 键
//获取哈希表中所有字段
HVALS 键
//获取哈希表中所有值
list类型
在Redis中list类型时按照插入顺序排序的字符串链表,可以在左侧和右侧添加新元素
如果该键不存在就会创建这个键对应的链表
如果键对应的链表没有元素就会将键也移除
list可以包含的元素为2^32-1个
常用命令
lpush 键 元素 元素
//从左边向指定的键中添加一个或多个元素,返回元素个数
rpush 键 元素 元素
//从右边向指定的键中添加一个或多个元素,返回元素个数
l/rpop 键
//从左/右侧删除一个元素,返回被删除的元素
lrange 键 开始 结束
//得到键中指定范围的元素的数据
从左到右的索引为0-n
从右到左的索引为-1-(-(n+1))
所以从左到最后一个即为0--1
lindex 键 索引值
//查询指定索引的元素
llen 键
//获取列表的长度
BRPOP key1 [key2] timeout
//移出并获取列表的最后一个元素,如果列表没有元素就会阻塞队列直到有元素或超时
LREM key 删除元素个数 value值
//从表头删除指定个数的元素
Set类型
没有排序的字符集合,不可重复
可包含的最大元素数量为2^32-1个
常用命令
sadd 键 元素 元素
//向一个键中添加一个或多个元素
smemers 键
//得到这个集合中所有的元素
sismember 键 元素
//判断指定的元素在集合中是否存在,存在返回1,不存在返回0
srem 键 元素 元素
//通过键删除一个或者多个元素
sinter key1 [key2]
//返回给定所有集合的交集(集合中共有的部分)
Zset/sorted set类型
sorted set有序集合
和set集合类似,但每个元素会关联一个分数作为排序因子
通过分数进行从小到大的排序
集合成员唯一但分数可以重复
常用命令
zadd 键 分数 值 分数 值
//添加一个或多个元素,每个元素都有一个分数
zincrby key increment member
//对指定元素的分数进行增减操作
zrange 键 开始索引 结束索引
//获取指定范围的元素,得到所有元素,索引为0到-1
zrange 键 开始索引 结束索引 withscores
//查询指定元素和对应的分数
zrevrange 键 开始索引 结束索引 withscores
//按照分数倒序获取指定的元素和对应的分数
zrem 键 值 值
//删除一个或者多个值
zcard 键
//得到元素个数
zrank 键 值
//得到元素的索引号
zscore 键 值
//得到元素的分数
Redis通用命令
keys 匹配字符
//查询所有的键,可以使用通配符
//*匹配多个字符
//?匹配一个字符
del 键1 键2
//删除任何的值类型且可以同时删除多个键
exists键
//判断键是否存在,不存在返回0,存在返回1
type键
//判断指定键的值类型,返回类型名字
select数据库编号
//选择其他数据库
move键数据库编号
//将当前数据库中指定的键移动到另一个数据库中
TTL key
//返回给定key的剩余生存时间(TTL,time to live),以秒为单位
从Redis2.8开始
key不存在或已过期:-2
key存在或者没有设置过期时间:-1
flushall
//清空redis所有库(不推荐)
Java中操作Redis
Redis的java客户端
jedis
lettuce
redisson
Jedis
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.0</version>
</dependency>
Jedis类的常用方法
方法名即为redis中的命令名
方法参数即为命令参数
每次访问Redis数据库时都需要创建一个jedis对象
Spring Data Redis
Spring的一部分,在Spring应用中通过简单的配置即可访问Redis服务,高度封装了Redis底层开发包
@Autowired
private RedisTemplate<String,String> redisTemplate;
//注入redisTemplate
@Autowired
private StringRedisTemplate stringRedisTemplate
//redisTemplate的子类,避免写泛型
ValueOperations<String,String> vop = redisTemplate.opsForValue();
//根据redisTemplate获取操作String类型数据的对象
可以使用stringRedisTemplate
Redis持久化机制
服务端关闭会使数据部分丢失
因为redis服务器默认每隔一段时间才会写入一次内存数据到硬盘上
redis的持久化
因为redis的数据在ram上存储,所以断电就会丢失
所以需要保存到硬盘上做持久化操作
支持两种持久化方式:
RDB(快照)方式(默认)
将数据以快照方式写入二进制文件
默认文件名为dump.rdb
可以通过配置进行自动快照持久化
需要设置两个条件
时间和修改键数,当两个条件都满足时就会触发快照
优点:
持久化效率高
数据库宕机后数据恢复效率更高
缺点:
仍然可能出现数据丢失,如果在持久化之前出现宕机,就会丢失数据
AOF的存储方式
将每一个收到的写命令通过write函数追加到文件中
重启时会全部执行来进行重建
有三种同步策略
每秒同步
每次同步
不同步
优点:
AOF包含一个格式清晰,易于理解的日志文件用于记录所有修改操作,数据安全性更高,所有操作异步完成
缺点:
运行效率慢
文件更大