四:在Java中操作Redis(!!!)
1.使用"Jedis"操作Redis
1.使用"Jedis"操作Redis中的数据
2."注意": 方法名和命令是一样的 !!!!!!!!!
3.案例:
public void testRedis(){
//1.获取连接,连接到Redis
Jedis jedis=new Jedis("localhost",6379); //指定连接的Redis服务(localhost本地)
//2.执行具体操作
"(1)下面以String类型数据进行操作!!!"
//eg:我们要操作一个字符串类型的数据 比如向Redis中存入一个string类型的值 --key-value
jedis.set("username","xiaoming");
//get查询
String value= jedis.get("username");
System.out.println(value);
//del删除
jedis.del("username");
"(2)下面以哈希类型数据进行操作!!!"
//操作哈希类型的数据: eg:向Redis中存入(hset)一个哈希类的值 key-value
jedis.hset("myhash","addr","beijing");
//获取哈希的值:hget , 指定key,指定value
String hValue = jedis.hget("myhash", "addr");
System.out.println("hValue="+hValue);
"(3)java中Redis的通用命令!!!"
Set<String> keys = jedis.keys("*"); (=keys *)
//3.关闭连接
jedis.close();
}
2.使用Spring Data Redis 操作Redis(!!!!!!!!!!)
1."在Spring Boot项目中,使用Spring Data Redis来简化Redis操作!!!!!!!!!"
//操作Redis:通过redisTemplate模板类 调用相应的方法可以获取相应的对象,然后通过相应的对象来操作相应的数据!!!
Spring Data Redis 底层是对jedis作的封装
2.导入maven坐标:spring-boot-starter-data-redis
Spring Data Redis
Spring Data Redis 提供了一个高度封装的类:" RedisTemplate ",针对jedis客户端中大量的api进行来归类封装,将同一类型操作封装为operation接口,具体分类如下:
ValueOperations:简单K-V操作 (eg:String类型的数据)
SetOperations:set类型数据操作
ZSetOperations:zset类型数据操作(eg:有序集合类型的数据)
HashOperations:针对map类型的数据操作
ListOperations:针对list类型的数据进行操作
注意:"5个接口,来操作5种对应的数据类型"
(1)Spring Data Redis 操作String数据
public class SpringDataRedisTest {
@Autowired
private RedisTemplate redisTemplate; //只要application.yml中写了配置,就可以注入进来
//操作Redis:通过redisTemplate模板类 调用相应的方法可以获取相应的对象,然后通过相应的对象来操作相应的数据!!!
/**
* (1)操作String类型数据,即简单的K-V
* -->通过redisTemplate调用opsForValue()方法获得ValueOperations对象,然后使用这个对象来通过set等方法对String数据进行操作
*/
@Test
public void testString(){
/*ValueOperations valueOperations = redisTemplate.opsForValue(); //获取对象
valueOperations.set("city","beijing"); */
//a:通过set方法为String类型数据赋值
redisTemplate.opsForValue().set("city123","beijing"); //连着写
//b:通过get方法获取
String value=(String) redisTemplate.opsForValue().get("city123");
System.out.println("Value="+value);
//c:设置过期时间
redisTemplate.opsForValue().set("key0","value0",10l, TimeUnit.SECONDS); //key-value 10 单位:秒
//d:只有key不存在时设置key的值,如果key存在就不执行 (set key value)
Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city123", "nanjing");
System.out.println("aBoolean="+aBoolean); //false:代表"city123"已经存在,不会执行这条语句
}
}
(2)Spring Data Redis 操作Hash数据
/**
* (2)操作Hash类型数据
* -->通过redisTemplate调用opsForHash()方法获得HashOperations对象,然后使用这个对象来通过put等方法对Hash数据进行操作
*/
@Test
public void testHash(){
//获取hashOperations对象
HashOperations hashOperations = redisTemplate.opsForHash();
//a:存值:使用Hash"存储"对象的数据 (eg:为对象002存储数据)
hashOperations.put("002","name","ikun");
hashOperations.put("002","aeg","20");
hashOperations.put("002","addr","beijing");
//b:取值
String age = (String)hashOperations.get("002", "age");
System.out.println("age="+age);
//c:获取hash结构中所有的字段(field)
Set keys = hashOperations.keys("002");
for (Object key : keys) {
System.out.println(key);
}
//d:获取hash结构中所有的值value
List values = hashOperations.values("002");
for (Object value : values) {
System.out.println(value);
}
(3)Spring Data Redis 操作List列表数据
/**
* (3)操作List类型数据
* -->通过redisTemplate调用opsForList()方法获得listOperations对象,然后使用这个对象来通过leftPush等方法对List数据进行操作
*/
@Test
public void testList(){
//获得listOperations对象
ListOperations listOperations = redisTemplate.opsForList();
//a:存数据(leftPus):根据插入的顺序进行排序,且可以有重复元素
listOperations.leftPush("mylist1","a"); //存一个
listOperations.leftPushAll("mylist1","b","c","d");//存多个
//b:取值:range()
List<String> mylist = listOperations.range("mylist1", 0, -1);
for (String value : mylist) {
System.out.println(value);
}
//c:获取列表长度:size()
Long size = listOperations.size("mylist1");
System.out.println("size="+size);
//d:rightPop() key :移除并获取列表中的"最后一个元素"
Object o = listOperations.rightPop("mylist1");
System.out.println(o);
}
(4)Spring Data Redis 操作Set无序集合数据
/**
* (4)操作Set类型数据:无序且不可重复
* -->通过redisTemplate调用opsForSet()方法获得setOperations对象,然后使用这个对象来通过add()等方法对Set数据进行操作
*/
@Test
public void testSet(){
//获取setOperations对象
SetOperations setOperations = redisTemplate.opsForSet();
//a:存值:add()
setOperations.add("myset","a","b","c","a");
//b:取值:members()
Set<String>myset = setOperations.members("myset");
for (String o : myset) {
System.out.println(o);
}
//c:删除成员:remove()
setOperations.remove("myset","a","b");
System.out.println("111");
//取值:members()
myset = setOperations.members("myset");
for (String o : myset) {
System.out.println(o);
}
(5)Spring Data Redis 操作ZSet有序集合数据
/**
* (5)操作ZSet有序集合:有序(是根据分数从小到大进行排序)且不可重复
* -->通过redisTemplate调用opsForZSet()方法获得zSetOperations对象,然后使用这个对象来通过add()等方法对ZSet数据进行操作
*/
@Test
public void testZSet(){
//获取zSetOperations对象
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
//a:存值:add() key-value-source(double类型)
zSetOperations.add("myZset","a",10.0);
zSetOperations.add("myZset","b",11.0);
zSetOperations.add("myZset","c",12.0);
zSetOperations.add("myZset","a",13.0); //会覆盖原来a的值,所以a=13
//b:取值:range()
Set<String> myZset = zSetOperations.range("myZset", 0, -1);
for (String s : myZset) {
System.out.println("s="+s);
}
------------------->: b、c、a
//c:修改分数:incrementScore():为myZset成员的b元素,增加20分
zSetOperations.incrementScore("myZset","b",20.0);
//取值:range()
myZset = zSetOperations.range("myZset", 0, -1);
for (String s : myZset) {
System.out.println("修改完分数之后的排序s1="+s);
}
------------------->: c、a、b
//d:删除成员:remove()
zSetOperations.remove("myZset","a","b");
//取值:range()
myZset = zSetOperations.range("myZset", 0, -1);
for (String s : myZset) {
System.out.println("删除a,b元素之后的排序s2="+s);
}
------------------->: c
}
(6)通用操作:针对不同的数据类型都可以操作
/**
* (6)通用操作
*
*/
@Test
public void testCommon(){
//a:获取Redis中所有的key -->keys("*")
Set keys = redisTemplate.keys("*");
for (Object key : keys) {
System.out.println("key="+key);
}
//b:判断某个key是否存在 -->hasKey("key名称")
Boolean b = redisTemplate.hasKey("itcast");
System.out.println(b);
//c:删除指定key -->delete("key名称")
redisTemplate.delete("myZset");
//d:获取指定key对应的value的数据类型 --type("key名称")
DataType dataType = redisTemplate.type("mySet");
System.out.println("Myset的数据类型是:"+dataType);
}