常宁网站建设常宁网站建设,qq企业邮箱怎么申请,上海网站建站服务,wordpress阿里百秀5.2一、redis命令
1.redis通用命令
Redis 通用命令是一些 Redis 下可以作用在常用数据结构上的常用命令和一些基础的命令 常见的命令有#xff1a;
keys
查看符合模板的所有key#xff0c;不建议在生产环境设备上使用#xff0c;因为keys会模式匹配所有符合条件的key#…一、redis命令
1.redis通用命令
Redis 通用命令是一些 Redis 下可以作用在常用数据结构上的常用命令和一些基础的命令 常见的命令有
keys
查看符合模板的所有key不建议在生产环境设备上使用因为keys会模式匹配所有符合条件的key而redis是一个单线程的数据库这样会导致很多其它操作阻塞。如果redis是集群分布的则可以在重库中进行匹配保证主库中的业务不被阻塞。 例如 keys *心号是通配符还有另外两种通配符和 []具体功能自行查看。
del
删除一个指定的key。 比如现在库中有三个name我们要删除name3del name3返回值为1说明删除成功。
exists
判断key是否存在。 刚才在上面我们删除了name3现在我们来判断它是否存在exists name3返回0说明不存在
expire
给一个已经存在的key设置有效期单位为秒有效期到期时会自动删除。 我们给name2设置5秒的有效期测试一下返回1设置成功5秒后name2会被删除
ttl
查看一个key的剩余有效期。 刚才我们给name2设置有效期后使用ttl查看name2的剩余有效期返回2说明还剩2秒。 使用ttl查看name1的有效期返回-1说明name1是永久有效。 使用ttl查看name3的有效期返回-2说明name2在内存中不存在。
help [command]
help [command]可以帮助我们在命令行中查看命令的书写格式以及命令的作用如 当然也可以在redis官网文档中查询redis文档
2.Redis中key的层级结构
redis中的key可以用 “:” 进行分隔比如 key “nation:city:area”value“中国北京海淀区”
3.Redis中的数据结构 String String类型也就是字符串类型是Redis中最简单的存储类型。 其value是字符串不过根据字符串的格式不同又可以分为3类: ●string: 普通字符串 ●int: 整数类型可以做自增、自减操作 ●float: 浮点类型可以做自增、自减操作 不管是哪种格式底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m hash list Redis中的List类型与Java中的LinkedList类似可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。实际数据结构比较复杂可以自行了解 特征也与LinkedList类似: ●有序 ●元素可以重复 ●插入和删除快 ●查询速度一般常用来存储一个有序数据例如:朋友圈点赞列表,评论列表等。 set Redis的Set结构与Java中的HashSet类似可以看做是一个value为null的HashMap。 因为也是一个hash表 因此具备与HashSet类似的特征: ●无序set中的元素存放顺序和插入顺序不是一致的。 ●元素不可重复 ●查找快 ●支持交集、并集、差集等功能 SortedSet Redis的SortedSet是- -个可排序的set集合与Java中的TreeSet有些类似但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList) 加hash表。 SortedSet具备下列特性: ●可排序 ●元素不重复 ●查询速度快 因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。
二、redis客户端
redis常用客户端对比SpringDataReids集成了jedis和lettuce
1.jedis
jedis是java和redis两个单词的简写我们可以使用java代码操作jedis客户端对redis数据库进行操作。
导入包 dependencies!--单元测试依赖--dependencygroupIdorg.junit.jupiter/groupIdartifactIdjunit-jupiter-api/artifactIdversion5.9.1/version!--注释掉test作用域让junit在全域有效--
!--scopetest/scope--/dependency!--jedis依赖--dependencygroupIdredis.clients/groupIdartifactIdjedis/artifactIdversion4.3.1/version/dependency/dependencies编写测试类
public class TestJedis {private Jedis jedis;//在每个单元测试前建立连接BeforeEachvoid setUp(){//1.建立连接jedis new Jedis(127.0.0.1,6379);// Jedis jedis JedisConnectionFactory.getJedisFromPool();//2.设置密码
// jedis.auth();//3.选择库默认为0jedis.select(0);}//在每个单元测试后关闭连接AfterEachvoid tearDown(){if (jedis ! null){jedis.close();}}//测试使用jedis访问redisTestvoid testString(){jedis.set(name1,jack);String s jedis.get(name1);System.out.println(s);}
}jedis中操作redis的方法的方法名和reids原生的指令名称一致 执行testString就可以对redis数据库进行操作了
2.jedis连接池
上面创建jedis连接操作redis的方法有一个问题如果存在大量的redis操作我们就需要频繁的创建销毁jedis连接这样会造成很大的性能消耗。 所以我们引入jedis连接池
创建jedis连接池工厂
/*** author Watching* * date 2023/3/31* * Describe:jedis连接池工厂类*/
public class JedisConnectionFactory {//创建一个静态常量jedispool引用用于指向我们创建jedis连接池private static final JedisPool jedisPool;static {JedisPoolConfig jedisPoolConfig new JedisPoolConfig();//设置jedis连接池最大连接数量jedisPoolConfig.setMaxTotal(8);//设置jedis连接池最大空闲连接数量jedisPoolConfig.setMaxIdle(8);//设置jedis连接池最小空闲连接数量jedisPoolConfig.setMinIdle(0);//设置jedis连接池连接最长等待时间jedisPoolConfig.setMaxWaitMillis(200);jedisPool new JedisPool(jedisPoolConfig, 127.0.0.1, 6379, root, cdut2019);}//提供一个静态方法从jedis连接池中获取jedis连接public static Jedis getJedisFromPool() {return jedisPool.getResource();}
}编写测试类
测试类和直接使用jedis连接的测试类基本相同唯一不同的点是我们不需要通过new jedis(host,psssword)来获取连接而是直接调用jedis连接池工厂中的静态方法。
/*** author Watching* * date 2023/3/30* * Describe:*/public class TestJedis {private Jedis jedis;//在每个单元测试前建立连接BeforeEachvoid setUp(){//1.建立连接
// jedis new Jedis(127.0.0.1,6379);Jedis jedis JedisConnectionFactory.getJedisFromPool();//2.设置密码
// jedis.auth();//3.选择库默认为0jedis.select(0);}//在每个单元测试后关闭连接AfterEachvoid tearDown(){if (jedis ! null){jedis.close();}}//测试使用jedis访问redisTestvoid testString(){jedis.set(name1,jack);String s jedis.get(name1);System.out.println(s);}
}3.SpringDataRedis
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis。
提供了对不同Redis客户端的整合( Lettuce和Jedis )提供了RedisTemplate统- -API来操作Redis支持Redis的发 布订阅模型支持Redis哨兵和Redis集群支持基于Lettuce的响 应式编程支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化支持基于Redis的JDKCollection实现JDK原生的Collection不支持分布式
引入SpringDataRedis依赖
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependencies编写redis配置
spring:redis:host: 127.0.0.1port: 6379password: cdut2019lettuce:pool:min-idle: 8max-wait: 1000msmax-active: 8max-idle: 8测试
在springboot测试类中注入redistemplate进行测试
更改默认的客户端
SpringDataRedis默认使用的客户端时Lettuce如果想要使用jedis可以通过修改依赖文件
!--整合redis--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId!--排除lettuce使用jedis 避免堆外内存溢出异常--exclusionsexclusiongroupIdio.lettuce/groupIdartifactIdlettuce-core/artifactId/exclusion/exclusions/dependency!--引入jedis--dependencygroupIdredis.clients/groupIdartifactIdjedis/artifactId/dependency4.redisTemplate的序列化
在上面的测试中我们发现存在redis中的key和value有点奇怪这是redistemplate使用了默认的序列化器JDKSerializer 添加一个配置类就可以解决这个问题
/*** author Watching* * date 2023/3/31* * Describe:redis配置类* 更改jdk默认序列化*/
Configuration
public class RedisConfig extends CachingConfigurerSupport {Beanpublic RedisTemplateString,String redisTemplate(RedisConnectionFactory redisConnectionFactory){RedisTemplateString,String redisTemplate new RedisTemplate();//key和hashKey都设置为String序列化redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setKeySerializer(RedisSerializer.string());//value和hashValue都设置为JSON序列化redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setConnectionFactory(redisConnectionFactory);return redisTemplate;}
}在运行测试类的时候报错 Caused by: java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/jsontype/impl/StdTypeResolverBuilder 这是因为我们在使用GenericJackson2JsonRedisSerializer序列化但是却没有引入jackson依赖引入该依赖就行
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactId/dependency这下子就正常了 我们再尝试插入一个对象试试成功了。并且json数据中还多了一条class数据所以在get这个value的时候GenericJackson2JsonRedisSerializer可以帮我们反序列化。但是多出来的class信息会占用多余的空间所以我们建议还是使用手动序列化和反序列化比如使用JSONutil.parse**等
StringRedisTemplate
StringRedisTemplate默认使用String序列化器可以更方便在Redis中存储字符串类型的数据可以阅读源码来了解一下。