文章目录
一、故事背景
二、知识点主要构成
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的一些实战应用以及底层相关内容。
如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。