博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis 学习笔记(7)-cluster 客户端(jedis)代码示例
阅读量:7266 次
发布时间:2019-06-29

本文共 6655 字,大约阅读时间需要 22 分钟。

上节学习了及redis-cli终端下如何操作,但是更常用的场景是在程序代码里对cluster读写,这需要redis-client对cluster模式的支持,目前spring-data-redis(1.6.4)还不支持cluster,最新的1.7.0 RC1已经有cluster的相关实现了,不过目前尚未正式发布,所以现阶段要使用redis-cluster的话,client最好还是选用原生的,示例代码如下:

配置文件:

注:上面的这些节点,不需要配全,最少可以只保留一个cluster中的节点信息,运行时,jedis会自动发现其它节点,但是为了防止某个节点挂掉,所以建议配置时,还是多配置几个,保证这一堆节点中,至少有一个能连接上。

示例代码:

package com.cnblogs.yjmyzz.redis;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import redis.clients.jedis.JedisCluster;import redis.clients.jedis.JedisPool;import java.util.List;import java.util.Map;import java.util.Set;public class AppDemo {    private static Logger logger = LoggerFactory.getLogger(AppDemo.class);    private static JedisCluster jc = null;    private static final String KEYS_STRING = "STRING";    private static final String KEYS_SET = "SET";    private static final String KEYS_LIST = "LIST";    private static final String KEYS_HASH = "HASH";    private static final String KEYS_ZSET = "ZSET";    private static void addKey(final String conainter, final String key) {        if (!jc.exists(conainter)) {            jc.sadd(conainter, key);        } else {            if (!jc.smembers(conainter).contains(key)) {                jc.sadd(conainter, key);            }        }    }    /**     * 写入字符串缓存     *     * @param key     * @param value     * @return     */    private static String set(final String key, final String value) {        String result = jc.set(key, value);        addKey(KEYS_STRING, key);        return result;    }    /**     * 写入Set缓存     *     * @param key     * @param member     * @return     */    private static Long sadd(final String key, final String... member) {        Long result = jc.sadd(key, member);        addKey(KEYS_SET, key);        return result;    }    /**     * 从左侧写入List     *     * @param key     * @param string     * @return     */    private static Long lpush(final String key, final String... string) {        Long result = jc.lpush(key, string);        addKey(KEYS_LIST, key);        return result;    }    /**     * 写入HashMap缓存     *     * @param key     * @param field     * @param value     * @return     */    private static Long hset(final String key, final String field, final String value) {        Long result = jc.hset(key, field, value);        addKey(KEYS_HASH, key);        return result;    }    /**     * 写入ZSet缓存     *     * @param key     * @param score     * @param member     * @return     */    private static Long zadd(final String key, final double score, final String member) {        Long result = jc.zadd(key, score, member);        addKey(KEYS_ZSET, key);        return result;    }    private static Long zadd(final String key, final String member) {        Long result = jc.zadd(key, 0d, member);        addKey(KEYS_ZSET, key);        return result;    }    public static void main(String[] args) {        ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-redis.xml");        jc = ctx.getBean(JedisCluster.class);        Map
nodes = jc.getClusterNodes(); for (Map.Entry
entry : nodes.entrySet()) { logger.info(entry.getKey() + " => " + entry.getValue().toString()); //清空所有数据 try { entry.getValue().getResource().flushDB(); } catch (Exception e) { logger.info(e.getLocalizedMessage());//slave节点上执行flushDB会报错 } //entry.getValue().getResource().keys("*");//慎用,缓存数量较大时,会引起性能问题. } //检测key是否存在 logger.info(jc.exists("a").toString()); //字符串写入测试 logger.info(set("a", "hello world!")); logger.info(set("b", "hello redis!")); //字符串读取测试 logger.info(jc.get("a")); //set写入操作 logger.info("set写入测试 ==>"); logger.info(sadd("set1", "a", "b", "c") + ""); //缓存类型测试 logger.info(jc.type("set1")); //set读取测试 logger.info("set读取测试 ==>"); Set
set1 = jc.smembers("set1"); for (String s : set1) { logger.info(s); } //list写入测试 logger.info("list写入测试 ==>"); logger.info(lpush("list1", "1", "2", "3") + ""); //list读取测试 logger.info("list读取测试 ==>"); List
list1 = jc.lrange("list1", 0, 999); for (String s : list1) { logger.info(s); } //hash写入测试 logger.info("hash写入测试 ==>"); logger.info(hset("hash1", "jimmy", "杨俊明") + ""); logger.info(hset("hash1", "CN", "中国") + ""); logger.info(hset("hash1", "US", "美国") + ""); //hash读取测试 logger.info("hash读取测试 ==>"); Map
hash1 = jc.hgetAll("hash1"); for (Map.Entry
entry : hash1.entrySet()) { logger.info(entry.getKey() + ":" + entry.getValue()); } //zset写入测试 logger.info("zset写入测试 ==>"); logger.info(zadd("zset1", "3") + ""); logger.info(zadd("zset1", "2") + ""); logger.info(zadd("zset1", "1") + ""); logger.info(zadd("zset1", "4") + ""); logger.info(zadd("zset1", "5") + ""); logger.info(zadd("zset1", "6") + ""); //zset读取测试 logger.info("zset读取测试 ==>"); Set
zset1 = jc.zrange("zset1", 0, 999); for (String s : zset1) { logger.info(s); } //遍历所有缓存项的key logger.info("遍历cluster中的所有key ==>"); logger.info(jc.smembers(KEYS_STRING).toString()); logger.info(jc.smembers(KEYS_HASH).toString()); logger.info(jc.smembers(KEYS_SET).toString()); logger.info(jc.smembers(KEYS_LIST).toString()); logger.info(jc.smembers(KEYS_ZSET).toString()); }}

注:建议尽量避免用jedis对节点做keys的模糊搜索,该操作在缓存项较多时,可能会导致redis性能急剧下降,改进办法是自己弄一个集合,记录所有缓存的key,具体可参考上面的办法。此外,jedis提供的命令非常之多,但是没有详细的说明文档(估计,作者认为代码就是最好的文档),大体可以从方法前缀猜测出来,比如sXXX表示是对Set的操作,hXXX表示是对hash的操作,lXXX或rXXX是对list的操作,zXXX是对zset的操作,什么前缀都没有的,比如set/get是对字符串的操作。

有网友把jedis的操作整理了一份文档,请参见:  

最后,附加上文中示例的源码:

转载地址:http://xnfcm.baihongyu.com/

你可能感兴趣的文章
oracle 判断是不是数值/数字
查看>>
Struts2 - 传值
查看>>
C#并口操作
查看>>
WebView用法
查看>>
redolog文件头简单探究
查看>>
修改stb_image.c以让Duilib直接支持Ico格式的图标显示
查看>>
黄聪:WordPress制作插件中使用wp_enqueue_script('jquery')库不起作用解决方法
查看>>
ExtJs Model之convert的使用
查看>>
java File delete()执行失败原因(转)
查看>>
SQL 通配符
查看>>
XAML 命名空间和命名空间映射
查看>>
jquery 时间戳与日期转换
查看>>
Web应用程序的自动化测试库-FluentAutomation
查看>>
c++ new(不断跟新)
查看>>
Windows 8.1 应用再出发 (WinJS) - 几种新增控件(1)
查看>>
html的下拉框的几个基本使用方法
查看>>
Android总结篇系列:Activity中几个主要函数详解
查看>>
无法识别的属性“targetFramework”。请注意属性名称区分大写和小写。错误解决的方法...
查看>>
C语言指针传递详解
查看>>
C# DataTable的詳細使用方法
查看>>