Redis常见命令
Redis通用命令
help @generic
通过该帮助命令就可以看到Redis的通用命令。
常见的有下面这几种。
- KEYS 查看符合模板的所有key
KEY *
后面KEY跟的东西可以去变,比如说a*就是查询a开头的key。但是不建议在生产环境设备上使用,因为redis是单线程的,并且模糊查询给机器带来的负担是比较大的。
- DEl 删除一个指定的key
DEL name
这样就会删除一个name键。若是DEL key1 key2 key3,就是删除三个key,返回的结果是删除成功的个数。
- EXITS 判断key是否存在
EXITS name
存在的话返回1,不存在的情况返回0
- EXPIRE 给一个key设置有效期,有效期到期的时候,key会自动的被删除
EXPIRE key 3
这就给key设置了3秒的生存期,三秒到了之后就会进行删除。想要看key还剩下多少秒进行存活可以使用TTL key命令来看,返回-1代表永久存在。
Redis数据结构介绍
Redis是一个Key-value的数据库,Key一般是String类型,但是Value的类型是多种多样的。
String
String类型,也就是字符串类型,是Redis当中最简单的存储类型,他的Value是字符串,根据字符串类型的不同可以分为三类,String:普通字符串,int:整数类型,可以自增自减,float:浮点类型,可以自增自减。
下面是常见的String命令
Redis的key允许有多个单词形成层级结构,多个单词之间使用‘:’隔开,格式如下
项目名:业务名:类型:id
set sun_User:User:1 '{"id":1,"name":"SHY","age":21}'
set sun_User:User:1 '{"id":2,"name":"JACK","age":22}'
可以看到形成了层级结构
Hash
Hash类型,也叫散列,其Value是一个无序结构,类似于Java当中的HashMap结构。String类型是将对象序列化为JSON字符串之后存储,当需要修改对象的某个字段的时候很不方便。
Hash可以将对象的每个字段独立存储,可以针对单个字段进行CRUD
下面是Hash的常用命令
HSET sun:User:3 name Lucy
HSET sun:User:3 age 18
HSET sun:User:4 name mike age 34 sex man
HGETALL sun:User:4
List
Redis当中的List类型与Java当中的LinkedList类似,可以看做一个双向链表结构,可以正向检索,也可以反向检索。
他是有序的,元素可以重复,插入和删除快,查询速度一般,通常用于存储有序数据
下面是一些常用命令
BLPOP和BRPOP不会立即返回nil,而是会等待一段时间,类似于阻塞队列的样子。
LPUSH users 1 2 3
RPUSH users 4 5 6
Set
Redis当中的Set结构与Java当中的HashSet类似,可以看做是一个value为null的HashMap,具备与HashMap类似的特征,比如无序,元素不可重复,查找快,支持交集,并集,差集等功能。
下面是常见的命令
案例练习
SADD ZhangSan LiSi WangWu ZhaoLiu
SADD LiSi WangWu MaZi ErGouSCARD ZhangSan
SINTER ZhangSan Lisi
SDIFF ZhangSan LiSi
SUNION ZhangSan LiSi
SISMEMBER ZhangSan LiSi
SISMEMBER LiSi ZhangSan
SREM ZhangSan LiSi
SortedSet
Resid 的SortSet是一个可排序的集合,与Java当中的TreeSet有些类似,但是底层的数据结构差距缺很大。SortSet的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的是一个跳表(SkipList)加hash表。
SortSet具有可排序,查询快,元素不重复的特点。
下面是常见命令
如果想达到降序的目的就在Z后面添加REV即可,比如ZREVRANK就是升序排名,以此类推…
ZADD TopList 100 ZyWoo 99 Monesy 101 S1mple 98 NiKO
Redis Java客户端
Jedis
连接
@BeforeEach
是 JUnit 测试框架中的一个注解,用于标记在每个测试方法执行之前需要运行的代码。这个注解通常用于设置测试环境、初始化测试数据或者执行一些前置条件检查,以确保每个测试方法都能在一个干净、一致的状态下运行
@BeforeEachvoid setUp(){//建立连接jedis = new Jedis("192.168.44.129",6379);jedis.auth("147015");jedis.select(0);}
测试
@Testvoid testString(){String result = jedis.set("name","张三");System.out.println("result = "+result);String name =jedis.get("name");System.out.println("name = "+name);}
测试后释放资源
@BeforeEachvoid tearDown(){if(jedis!=null){jedis.close();}}
坏处以及处理措施
Jedis本身是线程不安全的,并且频繁的创建和销毁线程连接会有性能损耗,因此我们推荐使用Jedis连接池来替代Jedis的直连方式
public class JedisPoolTest {private static final JedisPool jedispoll;static {JedisPoolConfig jedisPoolConfig =new JedisPoolConfig();//最大连接jedisPoolConfig.setMaxTotal(8);//最大空闲连接jedisPoolConfig.setMaxIdle(8);//最小空闲连接jedisPoolConfig.setMinIdle(0);//等待时间 msjedisPoolConfig.setMaxWaitMillis(20000);//建立连接jedispoll=new JedisPool(jedisPoolConfig,"192.168.44.129",6379,1000,"147015");}public static Jedis getJedis(){//返回获取Jedis对象return jedispoll.getResource();}}
SpringDataRedis
SpringData是Spring当中数据操作的模块,包括对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis。
先对该项目进行配置,引入依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency></dependencies>
编写匹配文件
spring.data.redis.host=192.168.44.129
spring.data.redis.database=0
spring.data.redis.password=147015
spring.data.redis.port=6379
spring.data.redis.lettuce.pool.max-idle=8
spring.data.redis.lettuce.pool.min-idle=0
spring.data.redis.lettuce.pool.max-wait=100ms
spring.data.redis.lettuce.pool.max-active=8
进行代码测试
@SpringBootTest
class SpringRedisApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;@Testvoid contextLoads() {//写入一条String数据redisTemplate.opsForValue().set("SpringRedisTest","我正在测试SpringRedisTest");Object o = redisTemplate.opsForValue().get("SpringRedisTest");System.out.println(o);}}
返回值成功,测试成功。
但是我们进入Redis时会发现变成这样子
这是因为java程序当中存入的key和value会被当成对象,被redis底层的默认序列化方法:jdk序列化工具jdkSerializationRedisSerialliszer
jdk的序列化方式是将数据转化为字节然后再存入redis当中。
我们可以通过改变RedisTemplate的序列化方式来解决问题。
@Configuration
public class RedisConfig {@Bean@ConditionalOnSingleCandidatepublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {//创建RediisTemplate对象RedisTemplate<String,Object> template =new RedisTemplate<>();//设置连接工厂template.setConnectionFactory(connectionFactory);//创建JSON序列化工具GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer=new GenericJackson2JsonRedisSerializer();//设置key的序列化template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());//设置Value的序列化template.setValueSerializer(jackson2JsonRedisSerializer);template.setHashValueSerializer(jackson2JsonRedisSerializer);//返回return template;}
的序列化
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
//设置Value的序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
//返回
return template;
}