如果我们使用Java操作Redis, 需要确保已经安装了 redis 服务及 Java redis 驱动。
Maven项目可以直接在pom.xml中加入jedis包驱动:
1<dependency> 2 <groupId>redis.clients</groupId> 3 <artifactId>jedis</artifactId> 4 <version>2.9.0</version> 5 </dependency>
Jedis中操作String,List,Set,Map,以及集合排序
1package com.ww.exercise; 2 3import java.util.HashMap; 4import java.util.Iterator; 5import java.util.List; 6import java.util.Map; 7import java.util.Set; 8 9import org.junit.Before; 10import org.junit.Test; 11 12import redis.clients.jedis.Jedis; 13 14/** 15 * 练习redis对接java 16 * @author 旺旺 17 */ 18public class RedisExercise { 19 20 private static Jedis jedis; 21 22 /*public static void setJedis() { 23 //连接到本地redis服务器 24 jedis = new Jedis("127.0.0.1",6379); 25 //验证用户密码 26 jedis.auth("zww"); 27 System.out.println("登入Redis数据库"); 28 }*/ 29 30 public static void main(String[] args) { 31 jedis = new Jedis("127.0.0.1",6379); 32 //验证用户密码 33 jedis.auth("zww"); 34 System.out.println("登入Redis数据库"); 35 exerciseString(); 36 exerciseHash(); 37 exerciseList(); 38 exerciseSet(); 39 exerciseSSet(); 40 } 41 42 /** 43 * 联系String类型的操作 44 */ 45 public static void exerciseString() { 46 //setJedis(); 47 //添加数据 48 jedis.set("name", "zww");//如果已存在,覆盖 49 System.out.println("新增." + jedis.get("name")); 50 51 //拼接数据 52 jedis.append("nane", " is my name"); 53 System.out.println("拼接." + jedis.get("name")); 54 55 //删除数据 56 jedis.del("name"); 57 System.out.println("删除." + jedis.get("name")); 58 59 //批量新增数据 60 jedis.mset("name","zww","age","20","email","www.ww.cn"); 61 jedis.decr("age");//Redis Decr 命令将 key 中储存的数字值减一。 62 //如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。 63 //如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。 64 //本操作的值限制在 64 位(bit)有符号数字表示之内。 65 System.out.println("批量." + jedis.get("name")+ jedis.get("age")+ jedis.get("email")); 66 67 } 68 69 /** 70 * 联系Hash类型的操作 71 */ 72 @Test 73 public static void exerciseHash() { 74 //添加数据 75 Map<String, String> user = new HashMap<String, String>(); 76 user.put("name", "zww"); 77 user.put("age", "20"); 78 user.put("email", "www.ww"); 79 jedis.hmset("user", user); 80 //取出user中的name,结果是一个泛型的List<String> 81 //第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key是可变参数 82 List<String> users = jedis.hmget("user", "name","age","email"); 83 System.out.println("新增." + users); 84 85 //拼接数据 86 jedis.hset("user", "hobby", "guitar"); 87 System.out.println("拼接." + jedis.hmget("user", "name","age","email","hobby")); 88 89 //拿到hash中所有key,再通过迭代器得到值 90 Iterator<String> userKey = jedis.hkeys("user").iterator(); 91 while (userKey.hasNext()) { 92 String key = userKey.next(); 93 System.out.println(key + ":" + jedis.hget("user", key)); 94 } 95 96 //部分删除数据 97 jedis.hdel("user", "email"); 98 System.out.println("删除." + jedis.hmget("user", "name","age","email","hobby")); 99 100 System.out.println("age:" + jedis.hmget("user", "age")); //因为删除了,所以返回的是null 101 System.out.println("user的键中存放的值的个数:" + jedis.hlen("user")); //返回key为user的键中存放的值的个数 102 System.out.println("是否存在key为user的记录:" + jedis.exists("user"));//是否存在key为user的记录 返回true 103 System.out.println("user对象中的所有key:" + jedis.hkeys("user"));//返回user对象中的所有key 104 System.out.println("user对象中的所有value:" + jedis.hvals("user"));//返回map对象中的所有value 105 106 //删除整个hash 107 jedis.del("user"); 108 System.out.println("删除后是否存在key为user的记录:" + jedis.exists("user"));//是否存在key为user的记录 109 110 } 111 112 /** 113 * 联系List类型的操作 114 */ 115 @Test 116 public static void exerciseList() { 117 //添加数据 118 jedis.lpush("framework", "spring"); 119 jedis.lpush("framework", "spring");//可以相同? 120 jedis.lpush("framework", "mybatis"); 121 jedis.lpush("framework", "struts2"); 122 List<String> framework = jedis.lrange("framework", 0, -1);//结果是一个泛型的List<String> 123 System.out.println("新增." + framework); 124 125 //部分删除数据 126 String pop = jedis.lpop("framework");//移除最左边的数据 127 System.out.println("移除." + pop); 128 System.out.println("移除后." + jedis.lrange("framework", 0, -1)); 129 130 } 131 132 /** 133 * 联系Set类型的操作 134 */ 135 @Test 136 public static void exerciseSet() { 137 //添加数据 138 jedis.sadd("database", "redis"); 139 jedis.sadd("database", "oracle"); 140 jedis.sadd("database", "mysql"); 141 jedis.sadd("databas", "redis");//可以相同? 142 Set<String> database = jedis.smembers("database");//结果是一个泛型的Set<String> 143 System.out.println("新增."+database); 144 145 //删除 146 jedis.srem("database","oracle");//移除成员 147 System.out.println("user中的value:"+jedis.smembers("database"));//获取所有加入user的value 148 System.out.println("chx是否是user中的元素:"+jedis.sismember("database","redis"));//判断chx是否是user集合中的元素 149 System.out.println("集合中的一个随机元素:"+jedis.srandmember("database"));//返回集合中的一个随机元素 150 System.out.println("user中元素的个数:"+jedis.scard("database")); 151 152 //再来个 153 jedis.sadd("database1", "redis"); 154 jedis.sadd("database1", "db2"); 155 jedis.sadd("database1", "mysql"); 156 157 System.out.println("获取两个数据库的交集:"+jedis.sinter("database","database1")); 158 System.out.println("获取两个数据库的并集:"+jedis.sunion("database","database1")); 159 160 } 161 162 /** 163 * 联系SSet类型的操作 164 */ 165 @Test 166 public static void exerciseSSet() { 167 //添加数据 168 jedis.zadd("bat", 1,"baidu"); 169 jedis.zadd("bat", 2,"ali"); 170 jedis.zadd("bat", 3,"tengx"); 171 jedis.zadd("bat", 3,"zww");//覆盖 172 Set<String> database = jedis.zrange("bat", 0, -1);//结果是一个泛型的Set<String> 173 System.out.println("所有成员:"+database); 174 175 //删除成员 176 //jedis.zrem("bat", "zww"); 177 jedis.zremrangeByScore("bat", 3, 3);//通过序号删除指定成员 178 System.out.println("所有成员:"+database); 179 180 } 181 182 /** 183 * 联系 类型的操作 184 */ 185 @Test 186 public void exercise() { 187 188 } 189 190}
Redis连接池
1package com.ww.exercise; 2 3import redis.clients.jedis.Jedis; 4import redis.clients.jedis.JedisPool; 5import redis.clients.jedis.JedisPoolConfig; 6 7public final class RedisPool { 8 9 private static String ADDR = "127.0.0.1"; //服务器IP地址 10 private static int PORT = 6379; //服务器端口 11 private static String PASSW = "zww"; //redis服务器密码 12 13 //可用连接实例的最大数目,默认为8; 14 //如果赋值为-1,则表示不限制,如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽) 15 private static Integer MAX_TOTAL = 1024; 16 //控制一个pool最多有多少个状态为idle(空闲)的jedis实例,默认值是8 17 private static Integer MAX_IDLE = 200; 18 //等待可用连接的最大时间,单位是毫秒,默认值为-1,表示永不超时。 19 //如果超过等待时间,则直接抛出JedisConnectionException 20 private static Integer MAX_WAIT_MILLIS = 10000; 21 private static Integer TIMEOUT = 10000; 22 //在borrow(用)一个jedis实例时,是否提前进行validate(验证)操作; 23 //如果为true,则得到的jedis实例均是可用的 24 private static Boolean TEST_ON_BORROW = true; 25 private static JedisPool jedisPool = null; 26 27 /** 28 * 静态块,初始化Redis连接池 29 */ 30 static { 31 try { 32 JedisPoolConfig conf = new JedisPoolConfig(); 33 /*注意: 34 在高版本的jedis jar包,比如本版本2.9.0,JedisPoolConfig没有setMaxActive和setMaxWait属性了 35 这是因为高版本中官方废弃了此方法,用以下两个属性替换。 36 maxActive ==> maxTotal 37 maxWait==> maxWaitMillis 38 */ 39 conf.setMaxTotal(MAX_TOTAL); 40 conf.setMaxIdle(MAX_IDLE); 41 conf.setMaxWaitMillis(MAX_WAIT_MILLIS); 42 conf.setTestOnBorrow(TEST_ON_BORROW); 43 jedisPool = new JedisPool(conf,ADDR,PORT,TIMEOUT,PASSW); 44 45 } catch (Exception e) { 46 e.printStackTrace(); 47 } 48 } 49 50 /** 51 * 获取Jedis实例 52 * @return 53 */ 54 public synchronized static Jedis getRedis() { 55 try { 56 if(jedisPool != null) { 57 //从线程池获取 58 Jedis jedis = jedisPool.getResource(); 59 } else { 60 System.out.println("没有找到jedis池"); 61 return null; 62 } 63 } catch (Exception e) { 64 e.printStackTrace(); 65 return null; 66 } 67 return null; 68 } 69 70}
看代码,写代码。