当前位置:   article > 正文

Java操作Redis的五大常用技巧,轻松上手!_java中redis怎么用

java中redis怎么用

Java操作Redis的5种常见方法

主要包括连接Redis服务器、设置键值对、获取键值对、删除键值对以及使用Redis的常用数据类型。以下是具体介绍:

  1. 连接Redis服务器
    • 在Jedis中,可以使用Jedis类的实例来连接到Redis服务器。
    • 在Lettuce中,可以使用RedisClient和StatefulRedisConnection来建立连接。
  2. 设置键值对
    • 在Jedis中,使用jedis.set(key, value)来设置键值对。
    • 在Lettuce中,使用redisCommands.set(key, value)来实现相同的功能。
  3. 获取键值对
    • 在Jedis中,使用jedis.get(key)来获取键对应的值。
    • 在Lettuce中,使用redisCommands.get(key)来实现相同的功能。
  4. 删除键值对
    • 在Jedis和Lettuce中,都可以使用del或类似的方法来删除键值对。
  5. 使用Redis的常用数据类型
    • Redis支持多种数据类型,如字符串、哈希、列表等。在Java中操作Redis时,可以根据需要选择合适的数据类型,并使用相应的方法进行操作。例如,对于哈希类型,可以使用hsethget等方法;对于列表类型,可以使用lpushrpop等方法。

Redis的客户端操作有以下几种方式:

jedis、redisson、lettuce、Redistemplate、jedisPool

1、jedis

jedis是Redis官方推荐的客户端,jedis是由socket实现的,它是同步的,所以一般需要自己实现连接池使用为佳。也可以使用apache的jedispool。

jedis相对来说更加的原生,只支持基本的数据类型如:

String、Hash、List、Set、Sorted Set。

Java实现操作redis

  1. <dependency>
  2. <groupId>redis.clients</groupId>
  3. <artifactId>jedis</artifactId>
  4. <version>2.9.0</version>
  5. </dependency>

操作:

  1. import redis.clients.jedis.Jedis;
  2. public class JedisDemo {
  3. public static void main(String[] args) {
  4. String host = "localhost";
  5. int port = 6379;
  6. Jedis jedis = new Jedis(host, port);
  7. jedis.set("key", "value");
  8. String value = jedis.get("key");
  9. System.out.println("Value is " + value);
  10. }
  11. }

2、redisson

redisson底层是netty实现,因此它是异步非阻塞,相对于jedis来说,redisson对结果有更多的包装,更加抽象,让开发者只关注于业务。

redisson对分布式的支持是它的一大亮点。

redisson支持的数据结构有:

List,

Set, 

Map, 

Queue, 

SortedSet, 

ConcureentMap, 

Lock,AtomicLong,

CountDownLatch

Java实现操作redis

  1. <dependency>
  2. <groupId>org.redisson</groupId>
  3. <artifactId>redisson</artifactId>
  4. <version>3.15.5</version>
  5. </dependency>

操作:

  1. Config config = new Config();
  2. config.useSingleServer().setAddress("redis://localhost:6379");
  3. RedissonClient redisson = Redisson.create(config);
  4. // 获取字符串
  5. RBucket<String> bucket = redisson.getBucket("myKey");
  6. String value = bucket.get();
  7. // 设置字符串
  8. bucket.set("myValue");
  9. // 获取Map
  10. RMap<String, String> map = redisson.getMap("myMap");
  11. String mapValue = map.get("myMapKey");
  12. // 设置Map
  13. map.put("myMapKey", "myMapValue");

3、lettuce

lettuce也是netty实现,也是异步非阻塞的。

  1. <dependency>
  2. <groupId>io.lettuce</groupId>
  3. <artifactId>lettuce-core</artifactId>
  4. <version>6.2.5.RELEASE</version>
  5. </dependency>

常见API

  1. public class LettuceUtil {
  2. public static void main(String[] args) {
  3. RedisURI redisUri = RedisURI.builder()
  4. .withHost("127.0.0.1").withPort(6379).withPassword("111111")
  5. .withTimeout(Duration.of(10, ChronoUnit.SECONDS))
  6. .build();
  7. RedisClient redisClient = RedisClient.create(redisUri);
  8. StatefulRedisConnection<String, String> connection = redisClient.connect();
  9. //获取同步操作命令工具
  10. RedisCommands<String, String> commands = connection.sync();
  11. System.out.println("清空数据:"+commands.flushdb());
  12. System.out.println("判断某个键是否存在:"+commands.exists("username"));
  13. System.out.println("新增<'username','xmr'>的键值对:"+commands.set("username", "xmr"));
  14. System.out.println("新增<'password','password'>的键值对:"+commands.set("password", "123"));
  15. System.out.println("获取<'password'>键的值:"+commands.get("password"));
  16. System.out.println("系统中所有的键如下:" + commands.keys("*"));
  17. System.out.println("删除键password:"+commands.del("password"));
  18. System.out.println("判断键password是否存在:"+commands.exists("password"));
  19. System.out.println("设置键username的过期时间为5s:"+commands.expire("username", 5L));
  20. System.out.println("查看键username的剩余生存时间:"+commands.ttl("username"));
  21. System.out.println("移除键username的生存时间:"+commands.persist("username"));
  22. System.out.println("查看键username的剩余生存时间:"+commands.ttl("username"));
  23. System.out.println("查看键username所存储的值的类型:"+commands.type("username"));
  24. connection.close();
  25. redisClient.shutdown();
  26. }
  27. }

4、JedisPool

由于jedis是同步的,因此用jedisPool连接

  1. <dependency>
  2. <groupId>redis.clients</groupId>
  3. <artifactId>jedis</artifactId>
  4. <version>3.7.0</version>
  5. </dependency>

使用示例:

  1. public class JedisConnectionFactory {
  2. private final static JedisPool jedisPool;
  3. static {
  4. //配置连接池
  5. JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
  6. //最大连接
  7. jedisPoolConfig.setMaxTotal(8);
  8. //最大空闲连接
  9. jedisPoolConfig.setMaxIdle(8);
  10. //最小空闲连接
  11. jedisPoolConfig.setMinIdle(0);
  12. //最长等待时间,ms
  13. jedisPoolConfig.setMaxWaitMillis(200);
  14. jedisPool = new JedisPool(jedisPoolConfig,
  15. "localhost",6379,1000,"123");
  16. }
  17. //获取jedis对象
  18. public static Jedis getJedis(){
  19. return jedisPool.getResource();
  20. }
  21. }
  22. @SpringBootTest
  23. class ProjectApplicationTests {
  24. //引入jedis
  25. private Jedis jedis;
  26. @BeforeEach
  27. void setUp() {
  28. //建立连接,host是自己的redis服务地址,port是端口号
  29. jedis = JedisConnectionFactory.getJedis();
  30. //设置密码
  31. jedis.auth("123456");
  32. // 选择库
  33. jedis.select(0);
  34. }
  35. @Test
  36. void testString() {
  37. // 存入数据
  38. String result = jedis.set("name", "小张");
  39. System.out.println("result = " + result);
  40. // 获取数据
  41. String name = jedis.get("name");
  42. System.out.println("name = " + name);
  43. }
  44. @Test
  45. void testHash() {
  46. //插入hash数据
  47. jedis.hset("user:1","name","小张");
  48. jedis.hset("user:1","age","22");
  49. //获取所有hash数据并输出
  50. Map<String, String> stringStringMap = jedis.hgetAll("user:1");
  51. System.out.println(stringStringMap);
  52. }
  53. @AfterEach
  54. void tearDown() {
  55. if (jedis != null)
  56. jedis.close();
  57. }

5、RedisTemplate

RedisTemplate是对jedis和lettuce的封装,springboot2.0之后,默认使用 lettuce,使用时只要配置好属性,就能自动由SpringBoot自动管理连接池。

jedis性能较强,jedis的性能至少是RedisTemplate的3倍以上,jedis结合jedisPool使用既可以有高性能又可以保证redis的连接可控。

在性能要求、并发操作不高的场景建议使用RedisTemplate,在并发高,性能要求高的场景下建议使用jedis。

Java实现

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>

操作:

  1. package test;
  2. import com.hs.springbootdemo.SpringbootdemoApplication;
  3. import com.hs.springbootdemo.dao.entity.UserEntity;
  4. import org.junit.Test;
  5. import org.junit.runner.RunWith;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.boot.test.context.SpringBootTest;
  10. import org.springframework.data.redis.core.RedisTemplate;
  11. import org.springframework.data.redis.core.StringRedisTemplate;
  12. import org.springframework.test.context.junit4.SpringRunner;
  13. import javax.annotation.Resource;
  14. @RunWith(SpringRunner.class)//SpringBoot 2.X 默认使用Junit4
  15. @SpringBootTest(classes = SpringbootdemoApplication.class)
  16. public class RedisTest {
  17. //如果无法注入RedisTemplate,就使用@Resource试试
  18. @Autowired
  19. private StringRedisTemplate stringRedisTemplate;//自带的字符串模板类,用于存储字符串
  20. @Autowired
  21. private RedisTemplate redisTemplate;//自带的对象模板类,用于存储对象
  22. @Test
  23. public void test() throws Exception
  24. {
  25. // 保存字符串
  26. stringRedisTemplate.opsForValue().set("username", "redis!!!");
  27. Logger logger = LoggerFactory.getLogger(RedisTest.class);
  28. String str = stringRedisTemplate.opsForValue().get("username");
  29. logger.warn(str);
  30. }
  31. @Test
  32. public void test1() throws Exception {
  33. UserEntity user = new UserEntity();
  34. user.setUsername("张三");
  35. user.setPassword("123456");
  36. redisTemplate.opsForValue().set("user_1", user);
  37. UserEntity user1 = (UserEntity) redisTemplate.opsForValue().get("user_1");
  38. System.out.println(user1.getUsername());
  39. }
  40. }

总结

Jedis性能好,适合高性能场景,不过要用JedisPool,如果对性能要求不高,或者在SpringBoot项目中使用RedisTemplate是不错的。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/630032
推荐阅读
相关标签
  

闽ICP备14008679号