Redis中数据是key-value形式。不同类型Value是有不同的命令进行操作。
key固定是string类型.且不能重复
Value有6中类型: 1. String 字符串2. Hash 哈希表3. List 列表4. Set 集合5. Sorted Set 有序集合.6 Stream类型(Redis5以后新版本类型)
1.exists
判断key是否存在。
exists key
返回值:存在返回1,不存在返回0
2.expire
设置key的过期时间,单位秒
expire key 秒数
返回值:成功返回1,失败返回0
3.ttl
查看key的剩余过期时间
ttl key
返回值:返回剩余时间,如果不过期返回-1
4.del
根据key删除键值对。
语法:del key
返回值:被删除key的数量
1.set
设置指定key的值。key不存在则新增,key存在则修改覆盖。键值对是永久存在的。
set key value
返回值:成功返回OK
2.get
获取指定key的值
语法:get key
返回值:key的值。不存在返回nil
3.setnx
当且仅当key不存在时才新增。
setnx key value
返回值:不存在返回1,存在返回0
4.setex
设置key的存活时间,如果存在key覆盖旧值。同时必须指定过期时间。
语法:setex key seconds value
返回值:OK
Hash类型的值中包含多组field value。
1.hset
给key中field设置值。
hset key field value
返回值:成功1,失败0
2.hget
获取key中某个field的值
语法:hget key field
返回值:返回field的内容
3.hmset
给key中多个filed设置值
语法:hmset key field value field value
返回值:成功OK
4.hmget
一次获取key中多个field的值
语法:hmget key field field
返回值:value列表
5.hvals
获取key中所有field的值
语法:hvals key
返回值:value列表
6hgetall
获取所有field和value
语法:hgetall key
返回值:field和value交替显示列表
7.hdel
删除key中任意个field
语法:hdel key field field
返回值:成功删除field的数量
一个键对应多个值
key value1 value2 value3 value4
1.Rpush
向列表末尾中插入一个或多个值
语法;rpush key value1 value2
返回值:列表长度
2.lrange
返回列表中指定区间内的值。可以使用-1代表列表末尾
语法:lrange list 0 -1
返回值:查询到的值
3.lpush
将一个或多个值插入到列表前面
语法:lpush key value1 value2
返回值:列表长度
4.llen
获取列表长度
语法:llen key
返回值:列表长度
5.lrem
删除列表中元素。count为正数表示从左往右删除的数量。负数从右往左删除的数量。
语法:lrem key count value
返回值:删除数量。 注意这个value需要和删除元素value一致才可以删除
set和java中set集合类似。不允许重复值,如果插入重复值,后新增返回结果为0。
1.sadd
向集合中添加内容。不允许重复。
语法:sadd key value value value
返回值:集合长度
2.scard
返回集合元素数量
语法:scard key
返回值:集合长度
3.smembers
查看集合中元素内容
语法:smembers key
返回值:集合中元素
不允许重复值,有序
有序集合中每个value都有一个分数(score),根据分数进行排序。
1.zadd
向有序集合中添加数据
语法:zadd key score value score value
返回值:长度
2.zrange
返回区间内容,withscores表示带有分数
语法:zrange key 区间 [withscores]
返回值:值列表
根据ID查询出内容。
语法:xrange key ID开始值 ID结束值。
Redis不仅仅是一个内存型数据库,还具备持久化能力。
Redis每次启动时都会从硬盘存储文件中把数据读取到内存中。运行过程中操作的数据都是内存中的数据。
一共包含两种持久化策略:RDB 和 AOF
rdb模式是默认模式,可以在指定的时间间隔内生成数据快照(snapshot),默认保存到dump.rdb文件中。
当redis重启后会自动加载dump.rdb文件中内容到内存中。用户可以使用SAVE(同步)或BGSAVE(异步)手动保存数据。
可以设置服务器配置的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令
可以通过save选项设置多个保存条件,但只要其中任意一个条件被满足,服务器就会执行BGSAVE命令。
save 900 1
save 300 10
save 60 10000
服务器在900秒之内,对数据库进行了至少1次修改
服务器在300秒之内,对数据库进行了至少10次修改
服务器在 60秒之内,对数据库进行了至少10000次修改。
优点
rdb文件是一个紧凑文件,直接使用rdb文件就可以还原数据。
数据保存会由一个子进程进行保存,不影响父进程做其他事情。
恢复数据的效率要高于aof
缺点
每次保存点之间导致redis不可意料的关闭,可能会丢失数据。
由于每次保存数据都需要fork()子进程,在数据量比较大时可能会比较耗费性能。
AOF默认是关闭的,需要在配置文件redis.conf中开启AOF。
Redis支持AOF和RDB同时生效,如果同时存在,AOF优先级高于RDB(Redis重新启动时会使用AOF进行数据恢复)
原理:实时保存用户执行的命令,恢复时执行之前保存的用户的命令
开启:
这个文件是自己创建的
修改redis.conf中。这个文件需要自己创建放到 /usr/local/redis目录下
appendonly yes 开启aof
appendfilename 设置aof数据文件,名称随意。
# 默认no
appendonly yes
# aof文件名
appendfilename "appendonly.aof"
优点
相对RDB数据更加安全。
缺点
相同数据集AOF要大于RDB。
相对RDB可能会慢一些。
1.导入依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
2.配置yml
spring:
redis:
host: 192.168.52.133
prot: 6379
测试类:
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Test
public void testString() {
redisTemplate.opsForValue().set("a","1",10, TimeUnit.SECONDS);
redisTemplate.opsForList().rightPushAll("b","1","2","3");
}
二.存储对象
1.实例类上一定要加Serializable接口
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private Integer id;
private String username;
private String password;
}
2.配置
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
//设置key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
//设置value的序列化器
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
}
3.测试
注意RedisTemplate的泛型是
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Test
public void testString() {
User user = new User(2, "张三", "hello world");
//存
redisTemplate.opsForValue().set("user:2",user);
//取
User u = (User)redisTemplate.opsForValue().get("user:1");
System.out.println("u = " + u);
}