一、Redis的客户端
1. Redis-cli:Redis自带的命令行客户端,可以使用redis-cli命令连接Redis服务器并执行命令。
2. Jedis:Java语言的Redis客户端,提供了丰富的API,可以进行数据的增删改查等操作。
3. ioredis:Node.js语言的Redis客户端,具有异步和同步操作的能力,性能较高。
4、Spring Data Redis:它是Spring的一部分,对Redis底层开发包进行了高度封装。
在Spring项目中,可以使用Spring Data Redis来简化操作。
以上是Redis的一些常见客户端,根据不同的需求和语言环境选择适合自己的客户端可以提高开发效率和程序性能。
二、Spring Data Redis使用方式
1、配置Spring Data Redis的依赖项
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、 配置Redis数据源
要注意在配置database:Rdeis数据库的时候,如果不配置database这一项,那默认的就是 0号数据库
3、 编写配置类,创建RedisTemplate对象
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
log.info("开始创建redis模板对象...");
RedisTemplate redisTemplate = new RedisTemplate();
// 设置Redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置redis key的序列化工具
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
测试 :
编写一个测试类进行测试,程序运行完成成功输出,说明上面的配置是成功的~~
三、 通过RedisTemplate对象操作Redis
1、操作字符串类型的数据
@Test
public void testString() {
// set get seteex setnx
/**
* set:将一个字符串设置为一个给定的值,并且这个值可以被后续的get操作获取到。
* get:获取一个给定key对应的数据值。
* setex:将一个字符串设置为一个给定的值,并且这个值会在特定的时间后过期。
* setnx:如果给定的key不存在,则将这个key设置为一个给定的值,并且这个值可以被后续的get操作获取到。 setex和setnx的区别在于,setex可以设置一个key的过期时间,而setnx只能设置一个key的值,无法设置过期时间。另外,如果key已经存在,setex会覆盖原有的值并且更新过期时间,而setnx则不会有任何操作。
*/
redisTemplate.opsForValue().set("city", "北京");
String city = (String) redisTemplate.opsForValue().get("city");
System.out.println(city);
redisTemplate.opsForValue().set("code", "1234", 3, TimeUnit.MINUTES);
redisTemplate.opsForValue().setIfAbsent("lock","1");
redisTemplate.opsForValue().setIfAbsent("lock","1");
}
2、操作哈希类型的数据
@Test
public void testHash() {
// hset hget hdel hlen hkeys hvals
/**
* hset:将哈希表 key 中的域 field 的值设为 value 。
* hget:返回哈希表 key 中给定域 field 的值。
* hmset:同时将多个 field-value (域-值)对设置到哈希表 key 中。
* hmget:返回哈希表 key 中,一个或多个给定域
*/
HashOperations hashOperations = redisTemplate.opsForHash();
hashOperations.put("100", "name", "tom");
hashOperations.put("100", "age", "28");
String name = (String) hashOperations.get("100", "name");
System.out.println(name);
Set keys = hashOperations.keys("100");
System.out.println(keys);
List values = hashOperations.values("100");
System.out.println(values);
hashOperations.delete("100", "age");
}
3、操作列表类型数据
@Test
public void testList() {
// lpush lrange rpop llen
/**
* 1. LPUSH:将一个或多个元素插入到列表的头部,并返回列表的新长度。
* 2. LRANGE:返回列表的一个或多个元素,可以指定起始和结束位置。
* 3. RPOP:从列表的尾部弹出并返回一个元素。
* 4. LLEN:返回列表的长度。
*/
ListOperations listOperations = redisTemplate.opsForList();
listOperations.leftPushAll("mylist", "a", "b", "c");
listOperations.rightPush("mylist", "d");
List mylist = listOperations.range("mylist", 0, -1);
System.out.println(mylist);
listOperations.rightPop("mylist");
Long mylist1 = listOperations.size("mylist");
System.out.println(mylist1);
}
4、操作集合类型的数据
@Test
public void testSet() {
// sadd smembers scard sunion srem
/**
* sadd用于向一个set中添加一个或多个成员;
* smembers用于返回一个set的所有成员;
* scard用于返回一个set的成员数量;
* sunion用于返回多个set的并集(即这些set中所有的成员);
* srem用于从一个set中移除一个或多个成员。
*/
SetOperations setOperations = redisTemplate.opsForSet();
setOperations.add("set1", "a", "b", "c", "d");
setOperations.add("set1", "a", "b", "x", "y");
Set members = setOperations.members("set1");
System.out.println(members);
Long set1 = setOperations.size("set1");
System.out.println(set1);
Set intersect = setOperations.intersect("set1", "set2");
System.out.println(intersect);
Set union = setOperations.union("set1", "set2");
System.out.println(union);
setOperations.remove("set1", "a", "b");
}
5、通用命令操作
@Test
public void testCommon() {
// keys exists type del
/**
* keys:列出所有匹配的key。
* exists:判断key是否存在。
* type:判断key的类型。
* del:删除key。
*/
Set keys = redisTemplate.keys("*");
System.out.println(keys);
Boolean name = redisTemplate.hasKey("name");
Boolean set1 = redisTemplate.hasKey("set1");
for (Object key : keys) {
DataType type = redisTemplate.type(key);
System.out.println(type);
System.out.println(type.name());
}
redisTemplate.delete("mylist");
}