(1)拉取镜像
docker pull redis:6.2.6
(2)创建并启动容器
docker run -d --name redis -p 6379:6379 --restart always redis:6.2.6
(3)进入redis客户端工具
docker exec -it redis redis-cli
Redis是以Key-Value形式进行存储的NoSQL数据库。 Redis是使用C语言进行编写的。
平时操作的数据都在内存中,效率特高,读的效率110000次/s,写81000次/s,所以多把Redis当做缓存工具使用(在一些框架中还把Redis当做临时数据存储工具)。缓存工具:把数据库中数据缓存到Redis中,由于Redis读写性能较好,访问Redis中数据,而不是频繁访问数据库中数据。
Redis以slot(槽)作为数据存储单元,每个槽中可以存储N多个键值对。Redis中固定具有16384个槽。理论上可以实现一个槽是一个Redis。每个向Redis存储数据的key都会进行crc16算法得出一个值后对16384取余就是这个key存放的solt位置。
虽然槽的大小是不固定的,但是Redis一个键值对最大大小为512M(String 类型Value)同时通过Redis Sentinel(哨兵)提供高可用,通过Redis Cluster(集群)提供自动分区。
(1)key
del key 删除
keys * 查看所有key
exists key 判断key是否存在
type key 查看key的类型
ttl key 查看key的剩余过期时间,单位秒。永久数据返回-1
(2)String类型value值操作命令
set key value : 设置值。如果值存在覆盖。
get key : 查询key的value值
setex key seconds value: 设置key并给定过期时间。如果key存在覆盖。
incr key: 对key的值加一
incrby key 数值: 对key的值增加或减少
(3)Hash类型value值操作命令
hset key field value:给key添加一个属性值
hmset key field value field value : 给key添加多个属性值hget key field: 获取某个属性的值
hmget key field field:获取多个属性的值
hgetall key : 取出所有属性值hkeys key: 获取所有属性名
hvals key: 获取所有属性值hdel key field field: 删除多个属性
hexists key field: 判断属性是否存在
hlen key :获取里面有多少个属性
(4)list类型value值操作命令
lpush key value: 向列表最左端插入
rpush key value: 向列表最右端插入
linsert key before|after 值 新值: 向值的前面或后面插入新值
lrange key 起始脚标 结束脚标: 查询列表一个区间的值
lrange key 0 -1: 查询全部lrem key count value:删除count个value
llen key: 长度
(5)set类型value值操作命令
sadd key value value: 新增多个值。值是不能重复,没有顺序。
smembers key : 查询全部
scard key: 长度
(6)sorted set类型value值操作命令
zadd key score value score value:插入多个值,每个值必须绑定一个数值。
zrange key 0 -1:升序查询
zrem key value:删除
zrevrange key 0 -1:降序查询
(7)stream类型value值操作命令
xadd key id field value: 插入值。
id可以是*自动生成,也可以是具体值,但是具体值必须大于目前存在的id的最大值。
xrange key - +:查询全部。
(1)导入依赖
org.springframework.boot
spring-boot-starter-data-redis
(2)配置redis地址
spring.redis.host=ip地址
(3)新建配置类
package com.bjsxt.config;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
@Component
public class RedisConfig {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
RedisTemplate stringObjectRedisTemplate = new RedisTemplate<>();
//配置key使用的序列化器
stringObjectRedisTemplate.setKeySerializer(new StringRedisSerializer());
//配置value使用的序列化器
stringObjectRedisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
//注入redis工程类
stringObjectRedisTemplate.setConnectionFactory(factory);
return stringObjectRedisTemplate;
}
}
(4)使用
package com.bjsxt.service.impl;
import com.bjsxt.mapper.UserMapper;
import com.bjsxt.pojo.User;
import com.bjsxt.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private UserMapper userMapper;
@Override
public User selectById(int id) {
//从redis中获取
User user = (User) redisTemplate.opsForValue().get("user");
if(user!=null && user.getId()==id){
return user;
}
User user1 = userMapper.selectById(id);
//保存到redis中
redisTemplate.opsForValue().set("user",user1);
return user1;
}
}
(5)方法
只要是Spring Data 的子项目被Spring Boot整合后都会有一个XXXXTemplate示实例。把Redis不同值得类型放到一个opsForXXX方法中。
opsForValue : String值(最常用),如果存储Java对象或Java中集合时就需要使用序列化器,将对象序列化成JSON字符串。
opsForList : 列表List
opsForHash: 哈希表Hash
opsForZSet: 有序集合Sorted Set
opsForSet : 集合
(1)JdkSerializationRedisSerializer
是RedisTemplate类默认的序列化方式。JdkSerializationRedisSerializer使用JDK自带的序列化方式。
(2)OxmSerializer
以字符串格式的xml存储。解析起来也比较复杂,效率也比较低。
(3)StringRedisSerializer
只能对String类型序列化操作。
(4)GenericToStringSerializer
需要调用者给传递一个对象到字符串互转的Converter(转换器),使用比较麻烦。
(5)Jackson2JsonRedisSerializer
该序列化器可以将对象自动转换为Json的形式存储,效率高且对调用者友好。
(6)GenericJackson2JsonRedisSerializer
与Jackson2JsonRedisSerializer功能相似。底层依然使用Jackson工具包。相比Jackson2JsonRedisSerializer多了_class列,列里面存储类(新增时类型)的全限定路径,从Redis取出时根据_class类型进行转换,解决了泛型问题。