四.Redis极简入门-Java操作Redis

x33g5p2x  于2021-12-19 转载在 其他  
字(11.3k)|赞(0)|评价(0)|浏览(652)

1.Java集成Jedis

开始在 Java 中使用 Redis 前, 我们需要确保已经安装并启动 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java。可以取Maven仓库下载驱动包 下载 jedis.jar,。

1.1.搭建工程
  • 搭建普通java项目,项目名:jedis-demo
1.2.导入Jedis依赖
  • 把Jedis和连接池包一起导入进来
  1. commons-pool2-2.2.jar #连接池
  2. jedis-2.5.2.jar #Jedis核心包
1.3.编写测试类
  • 通过Jedis客户端对象连接Redis,调用API进行Redis
  1. @Test
  2. public void testJedis()throws Exception{
  3. //创建连接
  4. String host ="127.0.0.1";
  5. //端口
  6. int port = 6379;
  7. //超时时间,1秒超时
  8. int timeout = 1000;
  9. //jedis客户端
  10. Jedis jedis = new Jedis(host,port,timeout);
  11. //认证
  12. jedis.auth("123456");
  13. //执行操作,保存值
  14. jedis.set("username","wang da cui");
  15. //获取值
  16. String result = jedis.get("username");
  17. System.out.print(result);
  18. //关闭连接
  19. jedis.close();
  20. }
1.4.连接池的使用

如果直接使用 Jedis链接Redis会造成频繁的Jedis对象创建和销毁,对性能会有很大的影响,所以我们会选择使用连接池来链接性能。原理同Mysql连接池

  • 编写测试方法,使用JedisPool连接池对象
  1. @Test
  2. public void test()throws Exception{
  3. //1 创建jedispool配置对象
  4. JedisPoolConfig config = new JedisPoolConfig();
  5. //2 做配置
  6. //最大空闲连接数
  7. config.setMaxIdle(2);
  8. //最大链接对象数
  9. config.setMaxTotal(10);
  10. //链接超时时间
  11. config.setMaxWaitMillis(1*1000);
  12. //获取连接是测试连接是否畅通
  13. config.setTestOnBorrow(true);
  14. //3 创建jedispool连接池对戏
  15. //参数:配置对象,redis主机地址 ,超时时间,密码
  16. JedisPool pool = new JedisPool(config,"127.0.0.1",6379,1*1000,"123456");
  17. //4 通过jedispool获取连接
  18. Jedis jedis = pool.getResource();
  19. //5 执行操作
  20. jedis.set("age",10);
  21. String result = jedis.get("age");
  22. System.out.println(result);
  23. // 6 释放连接 , 底层做了兼容,如果是连接池操作就是释放,如果是连接操作就是关闭
  24. jedis.close();
  25. // 7 摧毁连接池-如果是真正项目中它应该是一个受spring管理的单例
  26. pool.destroy();
  27. }
  • 工具类封装:JedisPool应该是单例的(想想你的Mybatis的DataSource也只是创建了一个),为了方便使用,将JedisPool封装成工具。

redis.properties

  1. redis.host=127.0.0.1
  2. redis.port=6379
  3. redis.password=123456
  4. redis.timeout=5000

RedisUtils

  1. package org.example;
  2. import redis.clients.jedis.Jedis;
  3. import redis.clients.jedis.JedisPool;
  4. import redis.clients.jedis.JedisPoolConfig;
  5. import java.io.IOException;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.Properties;
  9. import java.util.Set;
  10. /** * 获取连接池对象 */
  11. public enum RedisUtils {
  12. INSTANCE;
  13. //连接池
  14. static JedisPool jedisPool = null;
  15. static {
  16. //1 创建连接池配置对象
  17. JedisPoolConfig config = new JedisPoolConfig();
  18. //2 进行配置-四个配置
  19. config.setMaxIdle(1);//最小连接数
  20. config.setMaxTotal(11);//最大连接数
  21. config.setMaxWaitMillis(10 * 1000L);//最长等待时间
  22. config.setTestOnBorrow(true);//测试连接时是否畅通
  23. //3 通过配置对象创建连接池对象
  24. Properties properties = null;
  25. try {
  26. properties = new Properties();
  27. properties.load(RedisUtils.class.getClassLoader().getResourceAsStream("redis.properties"));
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. }
  31. String host = properties.getProperty("redis.host");
  32. String port = properties.getProperty("redis.port");
  33. String password = properties.getProperty("redis.password");
  34. String timeout = properties.getProperty("redis.timeout");
  35. jedisPool = new JedisPool(config, host, Integer.valueOf(port),Integer.valueOf(timeout), password);
  36. }
  37. //获取连接
  38. public Jedis getSource() {
  39. return jedisPool.getResource();
  40. }
  41. //关闭资源
  42. public void closeSource(Jedis jedis) {
  43. if (jedis != null) {
  44. jedis.close();
  45. }
  46. }
  47. /** * hash操作字符串============================================== */
  48. public List<String> hvals(String key) {
  49. Jedis jedis = getSource();
  50. List<String> hvals = jedis.hvals(key);
  51. closeSource(jedis);
  52. return hvals;
  53. }
  54. public Set<String> hkeys(String key) {
  55. Jedis jedis = getSource();
  56. Set<String> hkeys = jedis.hkeys(key);
  57. closeSource(jedis);
  58. return hkeys;
  59. }
  60. public Long hset(String key,String field,String value) {
  61. Jedis jedis = getSource();
  62. Long result = jedis.hset(key,field,value);
  63. closeSource(jedis);
  64. return result;
  65. }
  66. public String hmset(String key, Map<String,String> data) {
  67. Jedis jedis = getSource();
  68. String result = jedis.hmset(key,data);
  69. closeSource(jedis);
  70. return result;
  71. }
  72. public String hget(String key,String field) {
  73. Jedis jedis = getSource();
  74. String value = jedis.hget(key, field);
  75. closeSource(jedis);
  76. return value;
  77. }
  78. /** * hash操作byte[]============================================== */
  79. public List<byte[]> hvals(byte[] key) {
  80. Jedis jedis = getSource();
  81. List<byte[]> hvals = jedis.hvals(key);
  82. closeSource(jedis);
  83. return hvals;
  84. }
  85. public Set<byte[]> hkeys(byte[] key) {
  86. Jedis jedis = getSource();
  87. Set<byte[]> hkeys = jedis.hkeys(key);
  88. closeSource(jedis);
  89. return hkeys;
  90. }
  91. public Long hset(byte[] key,byte[] field,byte[] value) {
  92. Jedis jedis = getSource();
  93. Long result = jedis.hset(key,field,value);
  94. closeSource(jedis);
  95. return result;
  96. }
  97. public String hmset(byte[] key, Map<byte[],byte[]> data) {
  98. Jedis jedis = getSource();
  99. String result = jedis.hmset(key,data);
  100. closeSource(jedis);
  101. return result;
  102. }
  103. public byte[] hget(byte[] key,byte[] field) {
  104. Jedis jedis = getSource();
  105. byte[] value = jedis.hget(key, field);
  106. closeSource(jedis);
  107. return value;
  108. }
  109. /** * 删除key */
  110. public boolean del(String key) {
  111. Jedis jedis = getSource();
  112. long result = jedis.del(key);
  113. closeSource(jedis);
  114. return result > 0;
  115. }
  116. /** * 设置字符值 * * @param key * @param value :value是字符串,如果要存储对象,转成JSON字符串在存储 */
  117. public void set(String key, String value) {
  118. Jedis jedis = getSource();
  119. jedis.set(key, value);
  120. closeSource(jedis);
  121. }
  122. /** * 设置 * @param key * @param value */
  123. public void set(byte[] key, byte[] value) {
  124. Jedis jedis = getSource();
  125. jedis.set(key, value);
  126. closeSource(jedis);
  127. }
  128. /** * * @param key * @return */
  129. public byte[] get(byte[] key) {
  130. Jedis jedis = getSource();
  131. try {
  132. return jedis.get(key);
  133. } catch (Exception e) {
  134. e.printStackTrace();
  135. } finally {
  136. closeSource(jedis);
  137. }
  138. return null;
  139. }
  140. /** * 设置字符值 * * @param key * @return :返回的是JSON格式的字符串 ,考虑转对象 */
  141. public String get(String key) {
  142. Jedis jedis = getSource();
  143. try {
  144. return jedis.get(key);
  145. } catch (Exception e) {
  146. e.printStackTrace();
  147. } finally {
  148. closeSource(jedis);
  149. }
  150. return null;
  151. }
  152. }

2.Jedis的API操作

使用jedis来操作redis的key和value,而value有很多种类型,和命令操作一样。

2.1.key的操作
  1. System.out.println(jedis.keys("*"));
2.2.String的操作
  1. System.out.println(jedis.set("name","zhangsan"));//新增
  2. System.out.println(jedis.get("name"));//获取
  3. System.out.println(jedis.set("name","zhangsan1"));//修改
  4. System.out.println(jedis.get("name"));//获取
  5. System.out.println(jedis.del("name"));//删除
  6. System.out.println(jedis.keys("*"));//查看所有的key
2.3.List的操作
  1. jedis.lpush("students1","1","2","3","5","6"); //添加数据
  2. System.out.println(jedis.lrange("students1", 0, 3)); //获取数据
  • 排序操作,对于数字元素排序不需要加SortingParams,对于字符串需要指定SortingParams,并且指定使用assii值排序
  1. //对数字排序
  2. jedis.flushDB();
  3. //添加数据
  4. jedis.lpush("nums","1","2","3","4","8","5","3","1");
  5. //排序
  6. System.out.println(jedis.sort("nums"));
  7. //指定排序方式
  8. SortingParams sortingParams1 = new SortingParams();
  9. sortingParams1.desc();
  10. System.out.println(jedis.sort("nums", sortingParams1));
  11. //对字母排序
  12. jedis.lpush("langues","java","php","c++","test","ui");
  13. SortingParams sortingParams = new SortingParams();
  14. sortingParams.alpha();
  15. sortingParams.desc();
  16. System.out.println(jedis.sort("langues",sortingParams));
2.4.Set的操作
  1. jedis.sadd("students2","a1","b1","c1","b1"); //添加数据
  2. System.out.println(jedis.smembers("students2")); //获取成员
2.5.Hash操作
  1. jedis.hset("students3","student","zhangsan"); //添加数据
  2. System.out.println(jedis.hget("students3", "student")); //获取数据
2.6.Hash存储对象

序列化SerializeUtil.java

  1. import java.io.ByteArrayInputStream;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.ObjectInputStream;
  4. import java.io.ObjectOutputStream;
  5. public class SerializeUtil {
  6. /** * 序列化 * * @param object * @return */
  7. public static byte[] serialize(Object object) {
  8. ObjectOutputStream oos = null;
  9. ByteArrayOutputStream baos = null;
  10. try {
  11. // 序列化
  12. baos = new ByteArrayOutputStream();
  13. oos = new ObjectOutputStream(baos);
  14. oos.writeObject(object);
  15. byte[] bytes = baos.toByteArray();
  16. return bytes;
  17. } catch (Exception e) {
  18. }
  19. return null;
  20. }
  21. /** * 反序列化 * * @param bytes * @return */
  22. public static Object unserialize(byte[] bytes) {
  23. ByteArrayInputStream bais = null;
  24. try {
  25. // 反序列化
  26. bais = new ByteArrayInputStream(bytes);
  27. ObjectInputStream ois = new ObjectInputStream(bais);
  28. return ois.readObject();
  29. } catch (Exception e) {
  30. }
  31. return null;
  32. }
  33. }

实体类User.java

  1. import java.io.Serializable;
  2. public class User implements Serializable {
  3. @Override
  4. public String toString() {
  5. return "User{" +
  6. "username='" + username + '\'' +
  7. ", id=" + id +
  8. '}';
  9. }
  10. private String username;
  11. private Long id;
  12. public String getUsername() {
  13. return username;
  14. }
  15. public void setUsername(String username) {
  16. this.username = username;
  17. }
  18. public Long getId() {
  19. return id;
  20. }
  21. public void setId(Long id) {
  22. this.id = id;
  23. }
  24. public User() {
  25. }
  26. public User(String username, Long id) {
  27. this.username = username;
  28. this.id = id;
  29. }
  30. }

测试代码

  1. import com.alibaba.fastjson.JSON;
  2. import org.junit.Test;
  3. import java.util.*;
  4. public class RedisTest {
  5. private User createUser(){
  6. return new User("zs",1L);
  7. }
  8. private List<User> createUsers(){
  9. return Arrays.asList(
  10. new User("zs",1L),
  11. new User("zs",2L),
  12. new User("zs",3L),
  13. new User("zs",4L),
  14. new User("zs",5L),
  15. new User("zs",6L));
  16. }
  17. //查询所有的用户
  18. //根据id查询某个用户
  19. @Test
  20. public void test(){
  21. //存放====================================================================
  22. List<User> users = createUsers();
  23. Map<String,String> data = new HashMap<>(users.size());
  24. users.forEach(user -> {
  25. data.put(user.getId().toString(),JSON.toJSONString(user));
  26. });
  27. String hmsetResult = RedisUtils.INSTANCE.hmset("users", data);
  28. System.out.println(hmsetResult);
  29. RedisUtils.INSTANCE.hset("users","7",JSON.toJSONString(new User("zs",7L)));
  30. //取所有值==================================================================
  31. List<String> values = RedisUtils.INSTANCE.hvals("users");
  32. List<User> result = new ArrayList<>(values.size());
  33. values.forEach(value ->{
  34. result.add(JSON.parseObject(value,User.class));
  35. });
  36. System.out.println(values);
  37. //根据ID取User==============================================================
  38. String user = RedisUtils.INSTANCE.hget("users","1");
  39. System.out.println(user);
  40. }
  41. //查询所有的用户
  42. //根据id查询某个用户
  43. @Test
  44. public void test2(){
  45. //存放====================================================================
  46. List<User> users = createUsers();
  47. Map<byte[],byte[]> data = new HashMap<>(users.size());
  48. users.forEach(user -> {
  49. data.put(user.getId().toString().getBytes(),SerializeUtil.serialize(user));
  50. });
  51. String hmsetResult = RedisUtils.INSTANCE.hmset("users".getBytes(), data);
  52. System.out.println(hmsetResult);
  53. RedisUtils.INSTANCE.hset("users".getBytes(),"7".getBytes(),SerializeUtil.serialize(new User("zs",7L)));
  54. //取所有值==================================================================
  55. List<byte[]> values = RedisUtils.INSTANCE.hvals("users".getBytes());
  56. List<User> result = new ArrayList<>(values.size());
  57. values.forEach(value ->{
  58. result.add(((User)SerializeUtil.unserialize(value)));
  59. });
  60. System.out.println(result);
  61. //根据ID取User==============================================================
  62. byte[] user = RedisUtils.INSTANCE.hget("users".getBytes(),"7".getBytes());
  63. System.out.println(SerializeUtil.unserialize(user));
  64. }
  65. //查询所有的用户
  66. //根据id查询某个用户
  67. @Test
  68. public void test3(){
  69. //存放====================================================================
  70. RedisUtils.INSTANCE.hset("users".getBytes(),"7".getBytes(),SerializeUtil.serialize(new User("zs",7L)));
  71. //根据ID取User==============================================================
  72. byte[] user = RedisUtils.INSTANCE.hget("users".getBytes(),"7".getBytes());
  73. System.out.println(SerializeUtil.unserialize(user));
  74. }
  75. }
2.7.事务操作
  1. jedis.set("name","zs");
  2. jedis.set("age",18);
  3. //开启事务
  4. Transaction multi = jedis.multi();
  5. multi.incr("name");
  6. multi.incr("age");
  7. //提交事务
  8. List<Object> result = multi.exec();
  9. System.out.println(result);
  10. //关闭连接
  11. jedis.close();
  12. //关闭连接池
  13. pool.destory();

相关文章