redis 5大基本类型的用法

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");

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值