1.String
public class StringTest {
public Jedis jedis = JedisPoolUtil.getJedis();
@Test
//添加和获取
public void fun(){
jedis.set("num","1");
System.out.println(jedis.get("num"));
}
@Test
//删除值
public void fun1(){
jedis.del("num");
System.out.println(jedis.get("num"));
}
@Test
//自减和自减
public void fun2(){
jedis.set("num","1");
System.out.println(jedis.get("num"));
jedis.decr("num");
System.out.println(jedis.get("num"));
jedis.incr("num");
jedis.incr("num");
System.out.println(jedis.get("num"));
}
@Test
//加上/减去 一个数
//incrBy 返回的是修改之后的值如果原值是字符串不是数字,则会抛出异常
public void fun3(){
Long num = jedis.incrBy("num", 3);
System.out.println(num);
jedis.decrBy("num",10);
System.out.println(jedis.get("num"));
jedis.set("name","caopengfei");
//jedis.decrBy("name",1);
}
@Test
//字符串拼接
public void fun4(){
Long len = jedis.append("name", "123");
System.out.println(len);
System.out.println(jedis.get("name"));
}
}
2.Hash
public class HashTest {
public Jedis jedis = JedisPoolUtil.getJedis();
// hash 操作的是map对象
// 适合存储键值对象的信息
@Test
//存值 参数第一个变量的名称, map键名(key), map键值(value)
// 调用hset
public void fun() {
Long num = jedis.hset("hash1", "username", "caopengfei");
System.out.println(num);
String hget = jedis.hget("hash1", "username");
System.out.println(hget);
}
@Test
//也可以存多个key
// 调用hmset
public void fun1() {
Map<String, String> map = new HashMap<String, String>();
map.put("username", "caopengfei");
map.put("age", "25");
map.put("sex", "男");
String res = jedis.hmset("hash2", map);
System.out.println(res);//ok
}
@Test
//获取hash中所有的值
public void fun2() {
Map<String, String> map2 = new HashMap<String, String>();
map2 = jedis.hgetAll("hash2");
System.out.println(map2);
}
@Test
// 删除hash中的键 可以删除一个也可以删除多个,返回的是删除的个数
public void fun3() {
Long num = jedis.hdel("hash2", "username", "age");
System.out.println(num);
Map<String, String> map2 = new HashMap<String, String>();
map2 = jedis.hgetAll("hash2");
System.out.println(map2);
}
@Test
//增加hash中的键值对
public void fun4() {
Map<String, String> map2 = new HashMap<String, String>();
map2 = jedis.hgetAll("hash2");
System.out.println(map2);
jedis.hincrBy("hash2", "age", 10);
map2 = jedis.hgetAll("hash2");
System.out.println(map2);
}
@Test
//判断hash是否存在某个值
public void fun5() {
System.out.println(jedis.hexists("hash2", "username"));
System.out.println(jedis.hexists("hash2", "age"));
}
@Test
//获取hash中键值对的个数
public void fun6() {
System.out.println(jedis.hlen("hash2"));
}
// 获取一个hash中所有的key值
@Test
public void fun7() {
Set<String> hash2 = jedis.hkeys("hash2");
System.out.println(hash2);
}
// 获取所有的value值
@Test
public void fun8() {
List<String> hash2 = jedis.hvals("hash2");
System.out.println(hash2);
}
}
3.Set
/*
* Set集合,和List类的区别就是
* set中不会出现重复的数据
* 他可以进行聚合操作效率比较高
* 其余的操作基本上和list相同
*
* */
public class SetTest {
public Jedis jedis = JedisPoolUtil.getJedis();
@Test
/*添加元素删除元素*/
public void fun(){
Long num = jedis.sadd("myset", "a", "a", "b","abc");
System.out.println(num);
}
@Test
/*获得元素*/
public void fun1(){
Set<String> myset = jedis.smembers("myset");
System.out.println(myset);
}
@Test
/*移除元素*/
public void fun2(){
jedis.srem("myset","a","b");
Set<String> myset = jedis.del("myset");
System.out.println(myset);
}
@Test
//判断是否这个set中存在某个值
public void fun3(){
Boolean sismember = jedis.sismember("myset", "a");
System.out.println(sismember);
}
@Test
//获得A-B 获得差集合
public void fun4(){
jedis.sadd("myset1","123","32","abc","def","123456","sdfasd");
jedis.sadd("myset2","abc","345","123","fda");
Set<String> sdiff = jedis.sdiff("myset1", "myset2");
System.out.println(sdiff);
}
@Test
//获得交集
public void fun5(){
Set<String> sinter = jedis.sinter("myset1", "myset2");
System.out.println(sinter);
}
@Test
// 获得并集合
public void fun6(){
Set<String> sunion = jedis.sunion("myset1", "myset2");
System.out.println(sunion);
}
@Test
// 成员数量
public void fun7(){
System.out.println(jedis.scard("myset1"));
}
@Test
// 获得随机的一个成员
public void fun8(){
System.out.println(jedis.srandmember("myset1"));
}
@Test
// 将相差的成员放到一个新的set中同理交集和并集都可以后面均
// 加上一个store即可
// 并返回新的长度
public void fun9(){
System.out.println(jedis.sdiffstore("myset3","myset1","myset2"));
System.out.println(jedis.smembers("myset3"));
}
}
4.List
public void testList()
{
jedis.flushDB();
//添加一个list
System.out.println(jedis.lpush("sortedList", "3","6","2","0","7","4"));
//lpush命令:加入一个元素到左边的头部
System.out.println(jedis.lpush("collections", "5"));
//rpush命令:加入一个元素到右边的底部
System.out.println(jedis.rpush("collections", "9"));
//lpop命令移除并返回列表key的头元素
System.out.println(jedis.lpop("collections"));
//rpop命令:移除并返回列表key的尾元素
System.out.println(jedis.rpop("collections"));
//lrange命令:从左边开始列出list的元素 0 第一个元素 -1代表倒数第一个元素,-2代表倒数第二个元素
System.out.println(jedis.lrange("sortedList", 0, -1)));
//获取collections区间0-3的元素:
System.out.println(jedis.lrange("collections",0,3));
//删除指定元素:
//count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
//count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
//count = 0 : 移除表中所有与 VALUE 相等的值。
System.out.println(jedis.lrem("collections", count, "6"));
删除key
System.out.println(jedis.del("collections"));
//删除下表0-3区间之外的元素
System.out.println(jedis.ltrim("collections", 0, 3));
//获取collections下标为2的元素
System.out.println(jedis.lindex("collections", 2));
//修改collections指定下标1的内容
System.out.println(jedis.lset("collections", 1, "4"));
//llen命令:获取list的长度。
System.out.println(jedis.llen("collections"));
//排序
System.out.println(jedis.sort("collections"));
}
5.SortedSet和set极为的类似,他们是字符串的集合,没有重复的数据
@Test
public void SortedSetTest()
{
//存放数据
//jedis.lpush("collections", "1", "2", "3", "4", "5", "6", "7", "8", "9");
//获取所有元素
//System.out.println("collections的内容是:"+jedis.lrange("collections",0,-1));
//排序
SortingParams sortingParams = new SortingParams();
//System.out.println("排序后的结果:"+jedis.sort("collections",sortingParams.alpha()));
System.out.println("升序后的结果:"+jedis.sort("collections",sortingParams.asc()));
System.out.println("降序后的结果:"+jedis.sort("collections",sortingParams.desc()));
}
应用:1将user对象存入缓存中。
t_user表数据量很大,查询很频繁,鲜有更新操作,可以把t_user表放到redis缓存中,实现t_user表的快速查询。
1)过程中我们用到了object转jsonString
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.12</version>
</dependency>
2)准备User.java
public class User {
private String id;
private String name;
private int age;
private String sex;
public User() {
super();
}
public User(String id, String name, int age, String sex) {
super();
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
3)将User的数据放入到Redis
Jedis jedis = new Jedis("10.0.31.144",6379);
jedis.auth("redis");
User u1 = new User(UUID.randomUUID().toString(),"jack1",21,"m");
User u2 = new User(UUID.randomUUID().toString(),"jack2",22,"m");
User u3 = new User(UUID.randomUUID().toString(),"jack3",23,"m");
User u4 = new User(UUID.randomUUID().toString(),"jack4",24,"m");
User u5 = new User(UUID.randomUUID().toString(),"jack5",25,"m");
Map<String,String> userMap = new HashMap<String,String>();
userMap.put("u1",JSON.toJSONString(u1));
userMap.put("u2",JSON.toJSONString(u2));
userMap.put("u3",JSON.toJSONString(u3));
userMap.put("u4",JSON.toJSONString(u4));
userMap.put("u5",JSON.toJSONString(u5));
jedis.hmset("t_user",userMap);
4)到Redis数据库服务器上观察:
hvals t_user
1) "{\"age\":21,\"id\":\"740a1778-de0e-4426-b231-1f97d290b13c\",\"name\":\"jack1\",\"sex\":\"m\"}"
2) "{\"age\":23,\"id\":\"5133d99f-b8a0-4062-8624-89a5dc5c8e89\",\"name\":\"jack3\",\"sex\":\"m\"}"
3) "{\"age\":24,\"id\":\"f6d1a709-5f2c-4564-bec6-b8f63eef6a86\",\"name\":\"jack4\",\"sex\":\"m\"}"
4) "{\"age\":25,\"id\":\"4c8b4122-c9f9-41b2-ba29-c0de2a257370\",\"name\":\"jack5\",\"sex\":\"m\"}"
5) "{\"age\":22,\"id\":\"e48c6616-75c2-4d04-9e90-31b69a4632a4\",\"name\":\"jack2\",\"sex\":\"m\"}"
5)查询Redis中的User缓存数据(思路)
a。在把数据存入到缓存前对数据分组加标签,列如:jedis.sadd(user_list_by_sex_m,"u1");
b。再将ui对象转json字符串后放到hash中,列如:jedis.hmset("t_user",userMap); userMap.put('u1',"userjson字符串")
c。先根据分组的标签查询,jedis.smembers("user_list_by_sex_m")------->u1
d。从hash中取出user的map集合,jedis.hget("t_user",‘u1’)
t_user表数据量大,查询缓慢,如何实现t_user表数据的快速查询;
select * from t_user where age =25;
select * from t_user where sex = 'm';
select * from t_user where sex = 'w';
我们可以使用redis中的set类型预先设定查询结果集。
Jedis jedis = new Jedis("10.0.31.144",6379);
jedis.auth("redis");
//假设现在有mybatis的三个查询操作
//userMapper.getUserListByAge(25)
//userMapper.getUserListBySex("m")
//userMapper.getUserListBySex("f")
//预设查询结果集
final String user_list_by_age_25 = "user_list_by_age_25";
final String user_list_by_sex_m = "user_list_by_sex_m";
final String user_list_by_sex_f = "user_list_by_sex_f";
//在初始化redis缓存的时候,模拟预设查询结果集
// (在真正的开发中,使用mybatis二级换从数据库查询后再缓存到redis)
//定义userMap存放t_user表的所有数据
Map<String,String> userMap = new HashMap<String,String>();
User u1 = new User(UUID.randomUUID().toString(),"jack",21,"m");
userMap.put("u1",JSON.toJSONString(u1));
//u1 满足性别为m的条件,即u1为userMapper.getUserListBySex("m")的查询结果集
jedis.sadd(user_list_by_sex_m,"u1");
User u2 = new User(UUID.randomUUID().toString(),"rose",25,"f");
userMap.put("u2",JSON.toJSONString(u2));
//u2 满足sex='f' age=25
jedis.sadd(user_list_by_sex_f,"u2");
jedis.sadd(user_list_by_age_25,"u2");
User u3 = new User(UUID.randomUUID().toString(),"jack3",23,"m");
userMap.put("u3",JSON.toJSONString(u3));
//u3 满足sex='m'
jedis.sadd(user_list_by_sex_m,"u3");
jedis.hmset("t_user",userMap);
观察redis服务器:
127.0.0.1:6379> keys *
1) "user_list_by_age_25"
2) "user_list_by_sex_m"
3) "t_user"
4) "user_list_by_sex_f"
127.0.0.1:6379> hkeys t_user
1) "u1"
2) "u2"
3) "u3"
127.0.0.1:6379> hvals t_user
1) "{\"age\":21,\"id\":\"65224362-26b7-4858-9dfd-6c8df8d0dcce\",\"name\":\"jack\",\"sex\":\"m\"}"
2) "{\"age\":25,\"id\":\"cd23782e-90a5-4c80-8c31-d0c874e623f6\",\"name\":\"rose\",\"sex\":\"f\"}"
3) "{\"age\":23,\"id\":\"e5bb2423-c821-4267-b77c-0abef4777113\",\"name\":\"jack3\",\"sex\":\"m\"}"
127.0.0.1:6379> smembers user_list_by_age_25
1) "u2"
127.0.0.1:6379> smembers user_list_by_sex_m
1) "u1"
2) "u3"
127.0.0.1:6379> smembers user_list_by_sex_f
1) "u2"
127.0.0.1:6379>
这样在程序中userMapper.getUserListByAge(25)就可以通过从redis服务器上获得user_list_by_age_25数据进行使用。
Jedis jedis = new Jedis("10.0.31.144",6379);
jedis.auth("redis");
Set<String> userlist = jedis.smembers("user_list_by_sex_m");
for(String u : userlist){
//拿到对对应ser的json字符串
System.out.println(jedis.hget("t_user",u));
//...这里可以再使用json转object方法
}
6.hash 放 map
Jedis jedis = new Jedis("10.0.31.144",6379);
jedis.auth("redis");
User u1 = new User(UUID.randomUUID().toString(),"jack1",21,"m");
User u2 = new User(UUID.randomUUID().toString(),"jack2",22,"m");
User u3 = new User(UUID.randomUUID().toString(),"jack3",23,"m");
User u4 = new User(UUID.randomUUID().toString(),"jack4",24,"m");
User u5 = new User(UUID.randomUUID().toString(),"jack5",25,"m");
Map<String,String> userMap = new HashMap<String,String>();
userMap.put("u1",JSON.toJSONString(u1));
userMap.put("u2",JSON.toJSONString(u2));
userMap.put("u3",JSON.toJSONString(u3));
userMap.put("u4",JSON.toJSONString(u4));
userMap.put("u5",JSON.toJSONString(u5));
jedis.hmset("t_user",userMap);
//获取user的map
Map<String, String> mapjedis.hgetAll("t_user");
//获取用户json字符串,不带key
List<String> users= jedis.hvals("t_user");