1 简介01NoSQL非关系型数据库非结构化、无关联的、非SQL、BASE无法满足ACID、内存存储使用场景数据结构不固定、对安全性要求不高、有性能要求键值型、文档型、图型02Redis简介远程词典服务器特征键值型value支持不同数据结构单线程每个命令具有原子性低延迟速度快支持数据持久化支持主从集群和分片集群支持多语言客户端启动方式①默认启动redis-server②后台启动redis-server redis.conf③开机自启03Redis客户端命令行客户端redis-cliredis-cli [options] [commonds]图形化界面客户端resp修改配置文件防火墙开放端口号2 常见命令01数据结构keyStringvalue基本类型String/Hash/List/Set/SortedSet特殊类型GEO/BitMap/HyperLoghelp查看命令用法02通用命令针对所有key都可以使用的KEYS查看符合模板的所有keyDEL删除一个或多个指定的key返回值是删除的数量EXISTS判断key是否存在EXPIRE给一个key设置有效期到期自动删除TTL查看key剩余有效期03String类型Redis中最简单的存储类型三种格式字符串、整型、浮点SET添加或修改一个String类型的键值对GET根据key获取String类型的valueMSET/MGET批量多个INCR让一个整形的key自增1INCRBY指定自增步长INCRBYFLOAT让一个浮点类型的数字自增并指定步长SETNX添加一个String类型的键值对前提是这个key不存在否则不执行SETEX添加一个String类型的键值对并且指定有效期04key的层级格式key允许有多个单词形成层级结构多个单词用隔开例如abc:user:1和abc:product:1项目名:业务名:类型:idJava对象可以序列化成json文件05Hash类型无序字典可以将对象中每个字段独立存储增删改查更灵活HSET、HGET等06List类型双向链表可以支持正向检索和反向检索有序、元素可以重复插入删除快查询一般LPUSH左侧插入LPOP左侧删除并返回没有找到返回nilRPUSH右侧插入RPOP右侧删除并返回没有找到返回nilLRANGE key start end返回角标范围内的所有元素BLPOP和BRPOP在没有元素时等待指定时间不直接返回nil07Set类型无序、元素不可重复查找速度快支持交并SADD向集合添加一个或多个元素SREM删除SCARD返回集合中元素个数SISMEMBER key member判断元素是否在集合中SMEMBERS获取集合中所有元素SINTER key1 key2求交集SDIFF key1 key2求差集SUNION key1 key2求并集08SortedSet类型可排序集合底层实现的是SkipList和hash表可排序、元素不重复、查询速度快ZADD、ZREM等ZRANK获取指定元素的排名ZRANGE按范围查找元素3 Redis的Java客户端01Jedis以Redis命令作为方法名线程不安全多线程环境下需要基于连接池①引入依赖dependency groupIdredis.clients/groupId artifactIdjedis/artifactId version3.7.0/version /dependency②建立连接单元测试类private Jedis jedis; BeforeEach void setUp() { // 1.建立连接 // jedis new Jedis(/ip/, /端口/); jedis JedisConnectionFactory.getJedis(); // 2.设置密码 jedis.auth(/pw/); // 3.选择库 jedis.select(0); }③测试StringTest void testString() { // 存入数据 String result jedis.set(name, Alice); System.out.println(result result); // 获取数据 String name jedis.get(name); System.out.println(name name); }④释放资源AfterEach void tearDown() { if (jedis ! null) { jedis.close(); } }连接池package com.heima.jedis.util; import redis.clients.jedis.*; public class JedisConnectionFactory { private static JedisPool jedisPool;//连接池对象 static { // 配置连接池 JedisPoolConfig poolConfig new JedisPoolConfig(); poolConfig.setMaxTotal(8);//最大连接数 poolConfig.setMaxIdle(8);//最大空闲连接 poolConfig.setMinIdle(0);//最小空闲连接 poolConfig.setMaxWaitMillis(1000);//最多等待时长 // 创建连接池对象参数连接池配置、服务端ip、服务端端口、超时时间、密码 jedisPool new JedisPool(poolConfig, , , 1000, ); } public static Jedis getJedis(){ return jedisPool.getResource(); } }02SpringDataRedis整合了Jedis和Lettuce提供了RedisTemplate统一API等Springboot提供SpringDataRedis支持新建项目时勾选①引入依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency !--common-pool-- dependency groupIdorg.apache.commons/groupId artifactIdcommons-pool2/artifactId /dependency②配置文件yaml手动配置pool连接池才会生效spring: redis: host: port: password: lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 max-wait: 100ms③注入RedisTemplateAutowired private RedisTemplate redisTemplate;④编写测试SpringBootTest class RedisStringTests { Autowired private RedisTemplate redisTemplate; Test void testString() { // 写入一条String数据 redisTemplate.opsForValue().set(name, Alice); // 获取string数据 Object name redisTemplate.opsForValue().get(name); System.out.println(name name); } }03RedisSerializer写入Redis前会把Object序列化为字节形式默认使用JDK序列化但是不好用引入Jackson依赖SpringMVC会自动引入Configuration public class RedisConfig { Bean public RedisTemplateString, Object redisTemplate(RedisConnectionFactory connectionFactory){ // 创建RedisTemplate对象 RedisTemplateString, Object template new RedisTemplate(); // 设置连接工厂 template.setConnectionFactory(connectionFactory); // 创建JSON序列化工具 GenericJackson2JsonRedisSerializer jsonRedisSerializer new GenericJackson2JsonRedisSerializer(); // 设置Key的序列化 template.setKeySerializer(RedisSerializer.string()); template.setHashKeySerializer(RedisSerializer.string()); // 设置Value的序列化 template.setValueSerializer(jsonRedisSerializer); template.setHashValueSerializer(jsonRedisSerializer); // 返回 return template; } }private RedisTemplateString,Object redisTemplate;但是Json序列化器会将类的字节码写入有额外的内存开销04StringRedisTemplate统一使用String序列化器存对象时手动完成序列化和反序列化StringRedisTemplate默认使用String序列化方式Autowired private StringRedisTemplate stringRedisTemplate; // JSON序列化工具 private static final ObjectMapper mapper new ObjectMapper(); Test void testSaveUser() throws JsonProcessingException { // 创建对象 User user new User(Alice, 21); // 手动序列化 String json mapper.writeValueAsString(user); // 写入数据 stringRedisTemplate.opsForValue().set(user:200, json); // 获取数据 String jsonUser stringRedisTemplate.opsForValue().get(user:200); // 手动反序列化 User user1 mapper.readValue(jsonUser, User.class); System.out.println(user1 user1); }