Java原生操作Redis

我们平时在Spring Boot项目中常用Spring Data Redis 来操作Redis,但是在非Spring项目,或者对于初学者及学生一类,就有使用原生操作的需求。
话不多说,直接上代码:
连接Redis服务器类(此类可优化,改成redis连接池):

package redis;


import redis.clients.jedis.DefaultJedisClientConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisClientConfig;
import redis.clients.jedis.DefaultJedisClientConfig.Builder;

public class RedisConn {
	//Redis服务器地址
	private static String host="192.168.31.8";
	//Redis端口号, 默认是6379
	private static int port = 6379;
	//Redis 密码,没有设置可以为空
	private static String password="";
	//Redis 默认链接的数据库
	private static int databaseNo=5;
	
	private static Jedis jedisConn = null;
	
	static {
		Builder config = DefaultJedisClientConfig.builder()
				.database(databaseNo);
		//密码不为空时候设置密码
		if(password!=null && !"".equals(password)) {
			config.password(password);
		}
		JedisClientConfig jedisClientConfig = config.build();
		jedisConn = new Jedis(host,port,jedisClientConfig);
	}
	public static Jedis getJedis() {
		try {
			return jedisConn;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	public static void close() {
		if(jedisConn!=null) {
			jedisConn.close();
		}
	}
	
}

操作Redis类:

package redis;

import java.util.List;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jdc.utils.T;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;

/**
 * Redis 操作助手
 *
 */
public class RedisHelper {
		
	private static Jedis redisConn;
	
	/**
	 * 构造函数获取redis连接
	 */
	public RedisHelper() {
		if(redisConn==null) {
			redisConn = RedisConn.getJedis();
		}
	}
	/**
	 * 设置字符串值
	 @param key Redis键
	 @param value 待设置的值
	 @return 操作成功则返回OK
	 */
	public String setCacheString(String key,String value) {
		return redisConn.set(key, value);
	}
	/**
	 * 设置字符串值
	 @param key Redis键
	 @param value 待设置的值
	 @param min 过期时间(分钟)
	 @return 操作成功则返回OK
	 */
	public String setCacheString(String key,String value,long min) {
		min = min==0?1:min;
		return redisConn.set(key, value,SetParams.setParams().ex(min*60));
	}
	/**
	 * 设置对象
	 @param key Redis键
	 @param obj 对象
	 @return 
	 */
	public <T> boolean setCacheObject(String key,T obj) {
		String rs = redisConn.set(key, JSON.toJSONString(obj));
		return "OK".equals(rs);
	}
	/**
	 * 设置List
	 @param key Redis键
	 @param list list数据
	 @return
	 */
	public <T> boolean setCacheList(String key,List<T> list) {
		String rs = redisConn.set(key, JSON.toJSONString(list));
		return "OK".equals(rs);
	}
	/**
	 * 设置过期时间
	 @param key Redis键
	 @param minute 过期时间(分钟)
	 @return
	 */
	public long expire(String key, long minute) {
		return redisConn.expire(key, minute*60);
	}
	/**
	 * 获取字符串值
	 @param key Redis键
	 @return
	 */
	public String getCacheString(String key) {
		return redisConn.get(key);
	}
	/**
	 * 获取对象
	 @param key Redis键
	 @param clazz 对象类型
	 @return
	 */
	public <T> T getCacheObject(String key,Class<T> clazz) {
		String json = redisConn.get(key);
		return JSONObject.parseObject(json, clazz);
		
	}
	/**
	 * 获取List
	 @param key Redis键
	 @param clazz list中元素的对象类型
	 @return
	 */
	public <T> List<T> getCacheList(String key,Class<T> clazz) {
		String json = redisConn.get(key);
		return JSONObject.parseArray(json, clazz);
		
	}
	/**
	 * 获取Redis中的键
	 @param pattern
	 */
	public boolean delete(String key) {
		long rs = redisConn.del(key);
		return rs==1;
	}
	/**
	 * 判断key是否存在
	 @param key Redis中的键
	 @return
	 */
	public boolean hasKey(String key) {
		return redisConn.exists(key);
	}
	
}

Redis并没有提供分段锁的原生实现,但是可以通过使用Lua脚本在Redis中实现分段锁。 以下是一个使用Java代码实现Redis分段锁的示例: ```java public class RedisSegmentLock { private final JedisPool jedisPool; public RedisSegmentLock(JedisPool jedisPool) { this.jedisPool = jedisPool; } /** * 获取分段锁 * * @param key 锁的key * @param segmentNum 分段数量 * @param timeout 超时时间,单位:毫秒 * @return 是否成功获取锁 */ public boolean acquireLock(String key, int segmentNum, long timeout) { try (Jedis jedis = jedisPool.getResource()) { String script = "local segmentNum = tonumber(ARGV[1]);" + "local key = KEYS[1];" + "local timeout = tonumber(ARGV[2]);" + "local lockValue = redis.call('GET', key);" + "if lockValue == false then" + " lockValue = segmentNum;" + " redis.call('SET', key, lockValue);" + "end;" + "if tonumber(lockValue) <= segmentNum then" + " redis.call('INCR', key);" + " redis.call('PEXPIRE', key, timeout);" + " return true;" + "end;" + "return false;"; Object result = jedis.eval(script, Collections.singletonList(key), Arrays.asList(String.valueOf(segmentNum), String.valueOf(timeout))); return (Boolean) result; } } /** * 释放分段锁 * * @param key 锁的key */ public void releaseLock(String key) { try (Jedis jedis = jedisPool.getResource()) { jedis.del(key); } } } ``` 在上述代码中,我们使用Lua脚本实现了分段锁的逻辑。首先获取当前锁的值,如果当前锁的值不存在,则将其设置为当前分段编号,表示当前分段已经获取到锁。如果当前锁的值小于等于分段编号,则表示当前分段已经获取到锁,我们将当前锁的值增加1,并设置过期时间,最后返回获取锁成功;否则,返回获取锁失败。 在使用时,我们可以通过创建一个RedisSegmentLock实例,并调用acquireLock方法获取锁,调用releaseLock方法释放锁。 ```java JedisPool jedisPool = new JedisPool("localhost", 6379); RedisSegmentLock lock = new RedisSegmentLock(jedisPool); try { if (lock.acquireLock("my_lock_key", 5, 5000)) { // 获取锁成功,执行业务逻辑 } else { // 获取锁失败,执行其他逻辑 } } finally { lock.releaseLock("my_lock_key"); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值