目录
spring-data-redis 针对 jedis 提供了如下功能:
概述
Redis是一个高性能的,键值对的,将数据存储在内存中的非关系型数据库(nosql数据库 not only sql)
高性能:数据存储在内存中,直接访问内存
键值对: 新闻id(键):点赞数量(值)
商品id(键):{id:1000,name:"华为手机",price:3000}
非关系型数据库:数据存储是键值对的,没有二维表关系,不使用sql操作
使用Redis作为缓存,将一些访问量大,或者修改较少的数据使用Redis存储起来,对mysql形成保护
Linux 下使用 Docker 安装 redis
创建 redis 配置文件和数据映射挂载卷
mkdir -p /opt/redis/conf
mkdir -p /opt/redis/data
复制 redis.conf 文件到/opt/redis/conf 目录下(注意,此文件已设置密码为 123)
在此redis.conf 文件的 789行 将密码设置为123
允许远程连接访问
拉取镜像
docker pull redis:6.0
安装命令
docker run -d -p 6379:6379 --name redis --restart=always --privileged=true \
-v /opt/redis/conf/redis.conf:/etc/redis/redis.conf -v /opt/redis/data:/data \
redis:6.0
进入到容器
docker exec -it redis bash
进入到Redis
redis-cli
Redis数据结构
5种基本常用结构
string(字符串) hash(哈希) list(列表) set(集合 ) zset(sorted set:有序集合)
1.String(字符串)
string 是 redis 最基本的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
单值缓存
set key value
get key
del key
keys *
单值缓存值可以为 json 字符串
计数器
set news_views 0 设置文章访问量
incr news_views 文章访问量+1 (值加1)
decr news_views 文章访问量-1 (值减1)
get news_views 获得值
2.哈希结构
适合一个键存储多个属性值的场景 例如用户信息 新闻点赞,收藏信息
hset key 属性名1 属性值1
hset key 属性名2 属性值2
hget key 属性名
hdel key 属性名
hlen key 返回属性值的数量
hgetall key 返回所有的属性值
3.列表
lpush key value
rpush key value
lpop key
rpop key
lrange key 开始位置 结束位置 查询列表指定区间的元素
4.set 无序 不重复
sadd key vzaddalue1 value2
srem key value
smembers key 查看集合中所有元素
scard key 查看集合中元素的个数
5.zset 可以排序的不重复元素集合
zadd key 分数 值
zrem key 值
zscore key 返回值的分数
zcard key 查看集合中元素的个数
设置失效时间
有时候我们并不希望 redis 的 key 一直存在。例如缓存,验证码等数据,我们希望它们能在一定时间内自动的被销毁。
redis 提供了一些命令,能够让我们对 key 设置过期时间,并且让 key 过期之后被自动删除
设置值时可以设置有效时间
EX 表示以秒为单位
PX 表示以毫秒为单位
EX,PX 不区分大小写
set name jim EX 30 设置失效时间为 30 秒
ttl 键 查看剩余时间(秒)
pttl 键 查看剩余时间(毫秒)
设置值后设置有效时间
expire 键 时间(秒)
pexpire 键 时间(毫秒
java连接redis
redis官方提供了一个jedis的客户端,连接redis数据库 new jedis("ip","端口").set(key,value)
现在使用Spring中封装RedisTemplate类实现Java程序
搭建:
1.添加redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置连接redis
redis:
host: 192.168.247.128
port: 6379
password: 123
database: 0
pool:
max-active: 8 #连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms #连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 8 #连接池中的最大空闲连接
min-idle: 0 #连接池中的最小空闲连接
timeout: 5000ms #连接超时时间(毫秒)
host:虚拟机IP或是云服务器的IP
spring-data-redis 针对 jedis 提供了如下功能:
-
连接池自动管理,提供了一个高度封装的“RedisTemplate”类.
-
针对 jedis 客户端中大量 api 进行了归类封装,将同一类型操作封装为 operation 接口.
ValueOperations:简单 K-V 操作 SetOperations:set 类型数据操作 ZSetOperations:zset 类型数据操作 HashOperations:针对 map 类型的数据操作 ListOperations:针对 list 类型的数据操作
-
将事务操作封装,有容器控制。
-
针对数据的“序列化/反序列化”,提供了多种可选择策略(RedisSerializer) JdkSerializationRedisSerializer:POJO 对象的存取场景,使用 JDK 本身 序列化机制.
StringRedisSerializer:Key 或者 value 为字符串的场景,根据指定的 charset 对数据的字节序列编码成 string,是“new String(bytes, charset)”和 “string.getBytes(charset)”的直接封装。是最轻量级和高效的策略。
JacksonJsonRedisSerializer:jackson-json 工具提供了 javabean 与 json 之 间的转换能力,可以将 pojo 实例序列化成 json 格式存储在 redis 中,也可以将 json 格式的数据转换成 pojo 实例。
注入 RedisTemplate
@Autowired
RedisTemplate redisTemplate;
测试
redisTemplate.opsForValue().set("name", "aa");
redisTemplate.opsForValue().set("users", users,10*1000, TimeUnit.MILLISECONDS);
redisTemplate.hasKey("name");
redisTemplate.opsForValue().get("name");
redisTemplate.delete("users");
序列化键值
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<User>(User.class));