文章目录
- 一、故事背景
- 二、知识点主要构成
- 2.1、redis简介
- 2.2、基于CentOS Linux docker容器化安装redis
- 2.3、redis的数据类型
- 2.3.1、String类型
- 2.3.2、Hash类型
- 2.3.3、List类型
- 2.3.4、Set类型
- 2.3.5、SortedSet类型
- 2.4、Redis的Java客户端
- 2.4.1、Jedis
- 2.4.1.1、Jedis的使用步骤:
- 1、引入依赖
- 2、创建Jedis对象,建立连接
- 3、使用Jedis,方法名和Redis命令一致
- 4、释放资源
- 2.4.1.2、Jedis连接池:
- 2.4.2、SpringDataRedis
- 2.4.2.1、SpringDataRedis的使用步骤:
- 依赖引入
- 配置文件添加Redis相关配置信息
- 注入RedisTemplate
- 2.4.2.2、SpringDataRedis的序列化方式
- 三、总结提升
一、故事背景
最近在系统的回顾redis相关的知识,总结成系列博客,方便回顾,也希望大家能给出意见,帮助我更快的成长;
二、知识点主要构成
2.1、redis简介
Redis是一个开源的内存中数据结构存储,用作数据库、缓存、消息代理和流引擎。Redis提供数据结构,如字符串、散列、列表、集合、带范围查询的排序集合、位图、超日志、地理空间索引和流。Redis具有内置复制、Lua脚本、LRU驱逐、事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster的自动分区提供高可用性。
2.2、基于CentOS Linux docker容器化安装redis
docker run \
--restart=always \
--log-opt max-size=100m \
--log-opt max-file=2 \
-p 6379:6379 \
--name redis \
-v /usr/local/redis/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis/data:/data \
-d redis:5.0.7 \
redis-server /etc/redis/redis.conf \
--appendonly yes \
命令解释:
–restart=always 总是开机启动
–log是日志方面的
-p 6379:6379 将6379端口挂载出去
–name 给这个容器取一个名字
-v 数据卷挂载
/home/redis/myredis/myredis.conf:/etc/redis/redis.conf 这里是将 liunx 路径下的myredis.conf 和redis下的redis.conf 挂载在一起。
/home/redis/myredis/data:/data 这个同上
-d redis:版本号 表示后台启动哪个版本的redis
redis-server /etc/redis/redis.conf 以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录 /etc/redis/redis.conf 也就是liunx下的/home/redis/myredis/myredis.conf
–appendonly yes 开启redis 持久化
–requirepass 000415 设置密码 (如果你是通过docker 容器内部连接的话,就随意,可设可不设。但是如果想向外开放的话,一定要设置
2.3、redis的数据类型
2.3.1、String类型
字符串类型是Redis中最基本的数据存储类型,它是一个由字节组成的序列,在Redis中是二进制安全的。这意味着该类型可以接受任何格式数据,如JPEG图像数据和Json对象说明信息。它是标准的key-value,通常用于存储字符串、整数和浮点。Value可容纳高达512MB的数据。
由于所有数据都在单个对象中,Redis 中的字符串操作速度非常快。基本的 Redis 命令(如 SET、GET 和 DEL)如下:
- SET 键值 – 设置指定键的值。
- GET 键 – 检索指定键的值。
- DEL 键 – 删除给定键的值。
应用程序场景:非常常见的场景用于计算站点访问量、当前在线人数等。
2.3.2、Hash类型
hash 是一个键值(key=>value)对集合。Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。Redis的Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。和String略像,但value中存放的是一张表,一般用于多个个体的详细事项排列,String也可以做到,但要比hash麻烦许多。
- HSET – 将值映射到哈希中的键。
- HGET – 检索与哈希中的键关联的各个值。
- HGETALL –显示整个哈希内容。
- HDEL – 从哈希中删除现有的键值对。
应用程序方案:存储部分更改数据,如用户信息、会话共享。
2.3.3、List类型
list是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。Redis的列表允许用户从序列的两端推入或者弹出元素,列表由多个字符串值组成的有序可重复的序列,是链表结构,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着,即使有数以千万计的元素列表,也可以极快地获得10条记录在头部或尾部。可列入名单的要素最多只有4294967295个。
- LPUSH – 将值推送到列表的左端。
- RPUSH – 将值推送到列表的尾端。
- LRANGE – 检索一系列项目。
- LPOP/RPOP – 用于显示和删除两端的项目。
- LINDEX– 从列表中的特定位置获取值。
应用场景:最新消息排行榜;消息队列,以完成多程序之间的消息交换。
2.3.4、Set类型
Set 是 string 类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。所谓集合就是一堆不重复值的组合,并且是没有顺序的。在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还提供了诸如collection、union和differences等操作,使得实现诸如commandism、poperhike、secondfriends这样的功能变得很容易,或者选择是将结果返回给客户机,还是将它们保存到使用不同命令的新的集合中。
- SADD – 向集合中添加一个或多个项目。
- SISMEMBER – 找出一个项目是否是集合的一部分。
- SMEMBERS– 从集合中检索所有项目。
- SREM – 从集合中删除现有项。
2.3.5、SortedSet类型
sorted set也叫Redis zset ,和set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。可以按成员、排序顺序和分数值访问排序集中的项目。
- ZADD– 将具有分数的成员添加到排序集。
- ZRANGE–根据项目在排序顺序中的位置检索项目。withscores 选项生成实际分数值。
- ZRANGEBYSCORE –根据定义的分数范围从排序集中提取项目。withscores 选项生成实际分数值。
- ZREM–从已排序的集中删除项目。
使用场景:带有权重的元素,比如一个游戏的用户得分排行榜;比较复杂的数据结构,一般用到的场景不算太多。
2.4、Redis的Java客户端
2.4.1、Jedis
JavaRedis,以Redis命令作为方法名称,学习成本低,简单实用,但是Jedis实例是线程不安全的,多线程环境下需要基于连接池来使用;
2.4.1.1、Jedis的使用步骤:
1、引入依赖
<!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>
</dependency>
2、创建Jedis对象,建立连接
private Jedis jedis;
@BeforeEach
void setUp(){
//建立连接
jedis = new Jedis("124.70.79.190",6379);
//设置密码
//jedis.auth("");
//选择库
jedis.select(1);
}
3、使用Jedis,方法名和Redis命令一致
@Test
public void testString(){
String result = jedis.set("name","小明");
System.out.println(result);
String name = jedis.get("name");
System.out.println(name);
}
@Test
public void testHash(){
jedis.hset("user:1","name","Jack");
jedis.hset("user:1","age","21");
Map<String, String> stringStringMap = jedis.hgetAll("user:1");
System.out.println(stringStringMap);
String name = jedis.hget("user:1", "name");
System.out.println(name);
}
4、释放资源
@AfterEach
void tearDown(){
if (jedis!=null){
jedis.close();
}
}
2.4.1.2、Jedis连接池:
public class JedisConnectionFactory {
private static final JedisPool jedisPool;
static {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//最大连接
jedisPoolConfig.setMaxTotal(8);
//最大空闲连接
jedisPoolConfig.setMaxIdle(8);
//最小空闲连接
jedisPoolConfig.setMinIdle(8);
//设置最长等待时间
jedisPoolConfig.setMaxWaitMillis(200);
jedisPool = new JedisPool(jedisPoolConfig,"124.70.79.190",6379,1000);
}
//获取Jedis对象
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
2.4.2、SpringDataRedis
SpringData是Spring中数据操作的模块,包含了对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis;
它提供了对不同Redis客户端的整合,其中包括Lettuce和Jedis,提供了RedisTemplate统一API来操作Redis,支持Redis的发布订阅模型,支持Redis哨兵和Redis集群,支持基于JDK,JSON,Spring对象的数据序列化以及反序列化等;
2.4.2.1、SpringDataRedis的使用步骤:
依赖引入
<!--Redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--连接池-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
配置文件添加Redis相关配置信息
spring:
redis:
host: 124.70.79.190
port: 6379
database: 1
lettuce:
pool:
max-active: 8 #最大连接
max-idle: 8 #最大空闲连接
min-idle: 0 #最小空闲连接
max-wait: 100 #连接等待时间
注入RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
@Test
void testString(){
redisTemplate.opsForValue().set("name","wmj");
Object name = redisTemplate.opsForValue().get("name");
System.out.println(name);
}
2.4.2.2、SpringDataRedis的序列化方式
按上述例子往redis中存入一个key为name,value为wmj的字符串,实际在redis中key并不是我们所认识的name,value也不是我们所认识的wmj,通过可视化工具可以看到,RedisTemplate可以接受任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果:
我们可以自定义RedisTemplate的序列化方式,如下:
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
//1、创建RedisTemplate对象
RedisTemplate<String,Object> template = new RedisTemplate<>();
//2、设置连接工厂
template.setConnectionFactory(connectionFactory);
//3、创建JSON序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//4、设置key的序列化
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
//5、设置value的序列化
template.setValueSerializer(jsonRedisSerializer);
template.setHashValueSerializer(jsonRedisSerializer);
//6、返回
return template;
}
}
三、总结提升
本文阐述了Redis的一些基本概念、Redis的几种基本数据类型以及Redis的Java客户端的基本使用,后续还会更新Redis的一些实战应用以及底层相关内容。
如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。