大数据开发Redis核心实战(第四十二篇)

163 阅读5分钟

一、String

string类型是Redis中最基本的数据类型,它能存储任何形式的内容,包含二进制数据,甚至一张图片

  1. 一个string类型的值存储的最大容量是1GB
  2. string类型比较适合存储类型单一的数据
命令格式解释
setset key value给key设置一个value(字符串类型)
getget key获取key的值
incrincr key对key的值递增+1(值必须是数字)
decrdecr key对key的值递减-1(值必须是数字)
strlenstrlen key获取key值的长度

二、Hash

hash类型的值存储了字段和字段值的映射,字段和字段值只能是字符串,不支持其他数据类型。内部是无序字典

  1. hash类型的值里面最多存储2的32次方-1个元素
2.1、应用场景

hash也可以同于对象存储,比如存储用户信息,与字符串不一样的是,字符串是需要将对象进行序列化(比如json序列化)之后才能保存,而Hash则可以将用户对象的每个字段单独存储,这样就能节省序列化和反序列的时间。比如:存储用户的购买记录,比如key为用户id,field为商品id,value为商品数量。

三、List

list是一个有序的字符串列表,列表内部是使用双向链表(linked list)实现的。

  1. list列表类型的值最多存储2的32次方-1个元素
  2. 插入、删除非常快,时间复杂度为O(1)
  3. 索引定位很慢,时间复杂度为O(n)
命令格式解释
lpushlpush key value从列表左侧添加元素
rpushrpush key value从列表右侧添加元素
lpoplpop key从列表左侧弹出元素
rpoprpop key从列表右侧弹出元素
llenllen key获取列表的长度
lrangelrange key start stop获取列表指定区间的元素
lindexlindex key index获取列表指定角标的元素
lsetlset key index value修改列表中指定角标的元素
3.1、应用场景

lists应用场景非常多,它可以轻松的实现热销榜,可以实现工作队列(利用lists的push操作),将任务存在lists中,然后工作线程再用pop操作将任务取出进行执行。可以实现最新列表,比如最新评论。

lpush student zhangsan lisi wangwu

image-20221211134827596

rpush student1 zhangsan lisi wangwu

image-20221211135109353

可以采用lpush+rpop模拟先进先出的队列

左边进右边出

四、Set

Set集合中的元素都是不重复的,无序的

  1. set列表类型的值最多存储2的32次方-1个元素
  2. set能够提供判断一个成员是否在集合内的原因
命令格式解释
saddsadd key value向集合中添加元素
smemberssmembers key获取集合中所有元素
sremsrem key value从集合中删除指定元素
sismembersismember key value判断集合中是否包含指定元素
sdiffsdiff key1 key2获取两个集合的差集
sintersinter key1 key2获取两个集合的交集
sunionsunion key1 key2获取两个集合的并集
scardscard key获取集合中元素的数量
4.1、应用场景

redis的sets类型是使用哈希表构造的,因此复杂度是O(1),它支持集合内的增删改查,并且支持多个集合间的交集、并集、差集操作,可以利用这些集合操作,解决程序开发过程中很多数据集合间的问题,比如计算网站独立ip,用户画像中的用户标签,共享好友等功能。

五、SortedSet

有序集合,在集合类型的基础上位集合中每个元素都关联了一个分数

命令格式解释
zaddzadd key score value向集合中添加元素
zscorezscore key value获取集合中指定元素的分值
zrangezrange key start end获取集合的值并按照score从小到大排序,最小的在上面
zreverangezreverange key start end获取集合指定元素的排名(倒序)
zincrbyzincrby key num value给集合中指定元素增加分值
zcardzcard key获取集合中元素的数量
zremzrem key value从集合中删除指定元素
5.1、应用场景

主要应用于根据某个权重进行排序的队列的场景,比如游戏积分排行榜,设置优先级的任务列表,学生成绩等

六、代码实战

6.1、不使用redis连接池
package com.strivelearn.java.redis;
​
import redis.clients.jedis.DefaultJedisClientConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisClientConfig;
import redis.clients.jedis.JedisFactory;
​
/**
 * @author strivelearn
 * @version RedisOp.java, 2022年12月11日
 */
public class RedisOp {
    public static void main(String[] args) {
        DefaultJedisClientConfig config = DefaultJedisClientConfig.builder()
                                                                  .password("xys6154@")
                                                                  .build();
        Jedis jedis = new Jedis("192.168.234.100", 6379, config);
        String set = jedis.set("student", "zhangsan");
        String student = jedis.get("student");
        System.out.println(student);
        jedis.close();
    }
}
6.2、使用redis连接池
package com.strivelearn.java.redis;
​
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
​
/**
 * Redis连接池方式
 *
 * @author strivelearn
 * @version RedisPoolOp.java, 2022年12月11日
 */
public class RedisPoolOp {
    public static void main(String[] args) {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        //连接池最大空闲连接数
        jedisPoolConfig.setMaxIdle(10);
        //连接池创建的最大连接数
        jedisPoolConfig.setMaxTotal(10);
        //创建链接的超时时间
        jedisPoolConfig.setMaxWaitMillis(2000);
        //表示从连接池中获取链接的时候会测试一下,是否可用,这样可以保证取出的连接都是可用的
        jedisPoolConfig.setTestOnBorrow(true);
        //获取jedis连接池
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, "192.168.234.100", 6379);
        //从jedis连接池取出一个链接
        Jedis resource = jedisPool.getResource();
        String zhangsan = resource.get("student");
        System.out.println("student" + zhangsan);
        //1.如果jedis是直接创建的单链接,此时表示直接关闭这个链接
        //2.如果jedis是从连接池中获取的链接,此时会把这个链接返回给连接池
        jedisPool.close();
​
    }
}
6.3、封装Redis工具类
package com.strivelearn.java.redis;
​
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
​
/**
 * @author strivelearn
 * @version RedisUtils.java, 2022年12月11日
 */
public class RedisUtils {
    //私有构造函数,禁止new操作
    private RedisUtils() {
    }
​
    private static JedisPool jedisPool = null;
​
    /**
     * 获取redis链接
     *
     * @return
     */
    public static synchronized Jedis getJedis() {
        if (jedisPool == null) {
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            //连接池最大空闲连接数
            jedisPoolConfig.setMaxIdle(10);
            //连接池创建的最大连接数
            jedisPoolConfig.setMaxTotal(10);
            //创建链接的超时时间
            jedisPoolConfig.setMaxWaitMillis(2000);
            //表示从连接池中获取链接的时候会测试一下,是否可用,这样可以保证取出的连接都是可用的
            jedisPoolConfig.setTestOnBorrow(true);
            //获取jedis连接池
            jedisPool = new JedisPool(jedisPoolConfig, "192.168.234.100", 6379);
        }
        return jedisPool.getResource();
    }
​
    /**
     * 归还redis链接
     *
     * @param jedis
     */
    public static void returnResource(Jedis jedis) {
        jedis.close();
    }
}