java中redis的使用(包含单个redis和分布式多个redis)以及redis的几种数据类型介绍

redis:非关系型数据库,以key-value的形式存储数据,功能之一是做缓存功能。

首先是单个redis在java中的使用

  //redis连接池配置对象
        JedisPoolConfig config = new JedisPoolConfig();
        //在指定时刻通过pool能够获取到的最大的连接的jedis个数,默认8
        config.setMaxTotal(8);
        // 最大能够保持idle的数量,控制一个pool最多有多少个状态为idle的jedis实例,默认8
        config.setMaxIdle(8);
        // 在容器中的最小的闲置连接数,默认0
        config.setMinIdle(0);
        // 当连接池内的连接耗尽时,getBlockWhenExhausted为true时,连接会阻塞,
        // 超过了阻塞的时间(设定的maxWaitMillis,单位毫秒)时会报错
        //默认-1
        config.setMaxWaitMillis(1000);
        //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;默认是false
        config.setTestOnBorrow(true);
        //testWhileIdle:如果为true,表示有一个idle object evitor线程对idle object进行扫描,
        // 如果validate失败,此object会被从pool中drop掉;
        // 这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;默认是false
        config.setTestWhileIdle(false);
        //timeBetweenEvictionRunsMillis:表示idle object evitor两次扫描之间要sleep的毫秒数,逐出扫描的时间间隔(毫秒),
        // 如果为负数,则不运行逐出线程,默认为-1
        config.setTimeBetweenEvictionRunsMillis(-1);
        //通过连接池获取redis对象,并设置ip 端口 过期时间 密码 默认库的实例
        JedisPool jdpool = new JedisPool(config, "127.0.0.1", 6379, 10000, null, 0);
        Jedis jedis = jdpool.getResource();
        //向redis中写入数据
        jedis.set("test", "test1");
        //关闭连接
        jedis.close();

代码很短,通过连接池获取redis对象,然后操作redis数据库。

但是想在很多分布式项目需要部署在多台机器上。这时候一个redis服务就不够了。所以需要用到ShardeJedis对象。

redis分布式。

        //两个JedisShardInfo对象,分别填入两个redis服务的连接信息,然后放入一个list中
        JedisShardInfo jedisShardInfo1 = new JedisShardInfo("127.0.0.1", 6379, 5000);
        jedisShardInfo1.setPassword("123");
        JedisShardInfo jedisShardInfo2 = new JedisShardInfo("127.0.0.2", 6379, 5000);
        jedisShardInfo2.setPassword("456");
        List<JedisShardInfo> infos = Arrays.asList(jedisShardInfo1, jedisShardInfo2);
        //连接池配置信息
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(600);
        config.setMaxIdle(300);
        config.setMaxWaitMillis(1000);
        config.setTestOnBorrow(true);
        //从连接池获取redis对象
        ShardedJedisPool shardedJedisPool = new ShardedJedisPool(config, infos);
        ShardedJedis shardedJedis = shardedJedisPool.getResource();
        //操作redis数据库
        shardedJedis.set("test", "aaaa");

这里我们在连接池中放入了两个JedisShardInfo,所以当你把数据存入缓存的时候数据会进入两个redis中的其中一个。至于会进入哪一个,它会根据key来进行判定,你也可以在初始化pool的时候用参数keyTagPattern来指定。redis自带一个pattern

DEFAULT_KEY_TAG_PATTERN = Pattern.compile("\\{(.+?)\\}");

注意:

jedis和shardedJedis都是redis对象,可以对redis进行操作,但是shardedJedis不支持对多个key进行操作。例如如果想要在所有key中进行模糊搜索就不行。

redis语法

redis是以key-value的形式存储数据的,其中value的类型分为string,hash,list,set(集合),sorted set(有序集合)

1.string

set key value(设置指定 key 的值)

get key(获取指定 key 的值)

mget key1 key2 key3(所有(一个或多个)给定 key 的值,如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil )

append key value(如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾)

2.hash(Redis hash (java中的map),是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis中每个 hash 可以存储 232 - 1 键值对(40多亿))

hget key field(查看哈希表 key 中,指定的字段是否存在)

hset key field value(将哈希表 key 中的字段 field 的值设为 value)

hgetall(获取在哈希表中指定 key 的所有字段和值)

3.list(Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素))

llen key(获取列表长度)

lpush key value1 value2(将一个或多个值插入到列表头部)

rpush key value1 value2(将一个或多个值插入到列表尾部)

lrange key start stop(获取列表指定范围内的元素start,stop可以为正数和负数,正数代表第几个元素,负数代表倒数第几个元素)

4.set(Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员))

sadd key member1 member2(向集合添加一个或多个成员)

scard key (获取集合的成员数)

srem key member1 member2(移除集合中一个或多个成员)

5.sorted set(Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员))

zadd key score1 member1 score2 member2(向有序集合添加一个或多个成员,或者更新已存在成员的分数)

zcared key(获取有序集合的成员数)

zrem key member1 member2(移除有序集合中的一个或多个成员)

以上5中类型的存储方式,我们常用到的是前三种,对于这三种数据的使用场景,我的理解是

当需要记录的数据不需要进行增减并且不会修改的时候可以转为byte用string存储

当需要存储数据集合并且集合的数量会增减但是集合里单个元素不会修改的时候可以用list或set

当需要储存对象并且对象的属性需要修改,可以用hash

在上面列出的语法是比较常用的几个,其实还有很多语法没有写出来,大家可以自己去了解,推荐一下我经常浏览的网站http://www.runoob.com/redis/redis-keys.html

之所以要看这些语法,是因为在java中使用redis的方法名和redis的语法完全一样

例如:

redis.set()

redis.get()

redis.lpush()

redis.rpush()

最后,在文章一开始贴出的示例代码,其实可以进行封装工具类,或者通过spring bean的形式注入,所有的配置信息参数在properties文件中灵活配置。方法很多,就不详细说明了。

猜你喜欢

转载自blog.csdn.net/github_39538842/article/details/85160670
今日推荐