Redis学习---Java应用Redis Jedis
阅读目录
1.封装RedisUtil 构建redis连接池
2.使用Junit Test Redis String,List,Set Hash等基本数据类型存储
3.Redis 事务以及管道应用
4.Redis 限制登录小应用
<一> 封装RedisUtil构建redis连接池
1. Redis提供各种语言的API,目前基于Java语言实现的封装Jar有Jedis,在maven版本库最新版本2.9.0版本
使用maven构建工程,配置pom.xml文件,即可下载jedis Jar
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
2. 封装RedisUtil. 初始化连接池,使用static模块初始化,即类加载时就初始化
private static String HOST = "192.168.110.210"; private static Integer PORT = 6379; private static String AUTH = "123456"; // 可用连接实例的最大数目,默认值为8; // 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。 private static int MAX_ACTIVE = 1024; // 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8. private static int MAX_IDLE = 200; // 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出 private static int MAX_WAIT = 10000; private static int TIMEOUT = 10000; // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的; private static boolean TEST_ON_BORROW = true; private static JedisPool jedisPool = null; static { try { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxIdle(MAX_IDLE); jedisPoolConfig.setMaxWaitMillis(MAX_WAIT); jedisPoolConfig.setMaxTotal(MAX_ACTIVE); jedisPoolConfig.setTestOnBorrow(TEST_ON_BORROW); jedisPool = new JedisPool(jedisPoolConfig, HOST, PORT, TIMEOUT, AUTH); } catch (Exception ex) { System.out.println("===初始化redis连接池出错==="); } }
3.实例化Jedis对象,获得redis服务器连接池的一个客户端连接
public static synchronized Jedis getJedis() { Jedis jedis = null; if (jedisPool != null) { jedis = jedisPool.getResource(); System.out.println("jedis===="+jedis); } return jedis; }
<二> Redis 基本数据类型应用
1,String 类型应用
@Test public void testString() { jedis.set("name", "JJ");// 向key --->name放入了value--->JJ System.out.println("name value is " + jedis.get("name")); // 拼接 jedis.append("name", "is da jj"); System.out.println("name value is "+ jedis.get("name")); // 删除 jedis.del("name"); System.out.println("name value is" + jedis.get("name")); //设置多个key-value jedis.mset("name", "周哥", "age", "27", "sex", "男"); //对某个Key进行加1操作 jedis.incr("age"); //只允许对int类型操作 System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" + jedis.get("sex")); }
2. 操作Hash类型,Map
public void testMap() { Map<String, String> map = new HashMap<String, String>(); map.put("name", "梅西"); map.put("age", "30"); map.put("sex", "男"); // 设置key为user value 为map操作 jedis.hmset("user", map); List<String> list = jedis.hmget("user", "name", "age", "sex"); System.out.println("list" + list); // 删除map某个key jedis.hdel("user", "name"); System.out.println(jedis.hmget("user", "name")); System.out.println(jedis.hlen("user"));// 返回key为“user”的键中存放的值个数 System.out.println(jedis.exists("user"));// 查找是否“user” key的是否存在 System.out.println(jedis.hkeys("user")); // 返回所有的”user“ key 的map所有的key System.out.println(jedis.hvals("user")); // 返回“user” key的所有值 Iterator<String> iterator = jedis.hkeys("user").iterator(); while (iterator.hasNext()) { String key = iterator.next(); System.out.println("key=" + key + jedis.hmget("user", key)); } }
3. 操作List
public void testList() { jedis.del("java framework"); // 取key 为java framework的所有内容 System.out.println(jedis.lrange("java framework", 0, -1)); // 倒序放入 jedis.lpush("java framework", "spring"); jedis.lpush("java framework", "struct"); jedis.lpush("java framework", "hibernate"); // 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有 System.out.println(jedis.lrange("java framework", 0, -1)); jedis.del("java framework"); // 顺序放入 jedis.rpush("java framework", "spring"); jedis.rpush("java framework", "struts"); jedis.rpush("java framework", "hibernate"); System.out.println(jedis.lrange("java framework", 0, -1)); }
4. 操作Set
public void testSet() { // 添加 jedis.sadd("user2", "liuling"); jedis.sadd("user2", "xinxin"); jedis.sadd("user2", "ling"); jedis.sadd("user2", "zhangxinxin"); jedis.sadd("user2", "who"); // 移除noname jedis.srem("user2", "who"); System.out.println(jedis.smembers("user2"));// 获取所有加入的value System.out.println(jedis.sismember("user2", "who"));// 判断 who // 是否是user集合的元素 System.out.println(jedis.srandmember("user2"));// 返回key user2随机的一个元素 System.out.println(jedis.scard("user2"));// 返回集合的元素个数 }
<三> Redis 事务以及管道应用
1. 事务操作
public void testTranstaction() { jedis.del("n=0"); Transaction tx = jedis.multi(); // 开启事务 for (int i = 0; i < 10000; i++) { tx.set("n=" + i, "n=" + i); // 注意使用事务set } tx.zadd("foo", 1, "a"); tx.zadd("foo", 2, "b"); tx.zadd("foo", 3, "c"); Response<Set<String>> sose = tx.zrange("foo", 0, -1); tx.exec();// 提交事务 // System.out.println(jedis.get("n=0")); System.out.println(sose.get()); jedis.disconnect(); }
2. 管道方式操作
public void testPipelined() throws Exception { Pipeline pipeline = jedis.pipelined(); pipeline.zadd("foottt", 0, "aa"); pipeline.zadd("foottt", 1, "ba"); pipeline.zadd("foottt", 2, "ca"); //注意存入的 Response<Set<String>> stResponse2 = pipeline.zrange("foottt", 0, -1); pipeline.sync(); System.out.println(stResponse2.get().size()); // Response<Set<String>> sose2 = pipeline.zrange("foo", 0, -1); // System.out.println(sose2.get()); }
redis 管道的方式可以减少客户端与redis 的通信次数,提高性能
<四> 使用redis,限制每个用户的ID一个小时内只能登陆5次
实现思路:记录用户第五次的登陆时间,与现在的时间之差是否已经大于1小时,如果大于则可以登陆,如果不大于则不能登陆
public void testLogin4Hour() throws Exception { String id = "1234567"; /* * jedis.rpush(id, String.valueOf(System.currentTimeMillis())); * jedis.rpush(id,"操"); System.out.println(jedis.lindex(id, 1)); // * 取出key 为id的第2个元素值 */ jedis.del(id); // 模拟用户5次登陆 for (int i = 0; i < 5; i++) { jedis.rpush(id, String.valueOf(System.currentTimeMillis())); System.out.println("第" + (i + 1) + "次登陆的时间:" + DateUtils.date2string(new Date(System.currentTimeMillis()), "YYYY-MM-dd HH:mm:ss")); // 每隔10分钟登陆一次,第5次登陆则在40分钟之后 Thread.sleep(12 * 60 * 1000); } // 取出第五次的登陆的时间点 String value_5 = jedis.lindex(id, 4); System.out.println("第5次登陆的时间:" + DateUtils.date2string(new Date(Long.valueOf(value_5)), "YYYY-MM-dd HH:mm:ss")); Long diffTime = System.currentTimeMillis() - Long.valueOf(value_5); if (value_5 != null && diffTime <= 1 * 60 * 60 * 1000) { System.out.println("不能登陆"); } else { System.out.println("可以继续登陆"); } jedis.disconnect(); }

浙公网安备 33010602011771号