这些代码有问题吗(Jedis jedis = jedisPool.getResource(); Integer count = Integer.valueOf(jedis.get("count")); count--; jedis.set("count",count.toString()); return "没锁 卖出一张票 剩余 " + count ;)
时间: 2024-01-05 18:03:27 浏览: 80
这段代码存在线程安全问题,因为在多线程环境下,多个线程可能同时从Redis中读取count的值,并且对count进行操作,导致数据错误。
在这种情况下,可以使用Redis的原子操作incr和decr来避免这个问题。修改后的代码如下:
```
Jedis jedis = jedisPool.getResource();
Long count = jedis.decr("count");
return "没锁 卖出一张票 剩余 " + count ;
```
这里使用了Redis的decr方法,该方法会原子地将key对应的值减1,并返回减1后的值。因此在多线程环境下,多个线程对count进行操作时也不会出现数据错误的问题。
相关问题
public Jedis getJedis() { Jedis jedis = new Jedis(); JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), redisUrl.split(":")[0], Integer.valueOf(redisUrl.split(":")[1]), 36000, redisPassword, 8); jedis = jedisPool.getResource(); return jedis; } 怎么优化
可以将`JedisPool`对象创建放到类的初始化方法中,避免每次调用`getJedis()`方法时都创建一个新的`JedisPool`对象。此外,可以将`Jedis`对象归还给连接池,避免资源浪费。
以下是优化后的代码:
```java
private JedisPool jedisPool;
public void init() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(8);
poolConfig.setMaxIdle(8);
poolConfig.setMinIdle(0);
poolConfig.setMaxWaitMillis(36000);
jedisPool = new JedisPool(poolConfig, redisUrl.split(":")[0], Integer.valueOf(redisUrl.split(":")[1]), 36000, redisPassword, 8);
}
public Jedis getJedis() {
Jedis jedis = jedisPool.getResource();
return jedis;
}
public void close(Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
```
在使用完`Jedis`对象后,需要手动调用`close()`方法将其归还给连接池。如果使用try-with-resources语法,可以自动调用`close()`方法,避免忘记归还`Jedis`对象:
```java
try (Jedis jedis = jedisPool.getResource()) {
// do something with jedis
} catch (JedisException e) {
// handle exception
}
```
使用Jedis,配置文件如何写
使用Jedis连接Redis时,需要在配置文件中配置Redis的连接信息。
以下是一个示例配置文件:
```
# Redis服务器地址
redis.host=127.0.0.1
# Redis服务器端口号
redis.port=6379
# Redis连接密码(如果没有设置密码则不需要配置)
redis.password=
# Redis连接池的最大连接数
redis.pool.maxTotal=100
# Redis连接池的最大空闲连接数
redis.pool.maxIdle=50
# Redis连接池的最小空闲连接数
redis.pool.minIdle=10
# Redis连接池的最大等待时间(毫秒)
redis.pool.maxWaitMillis=5000
```
在Java程序中,可以使用Properties类读取配置文件,并获取Redis连接信息,如下所示:
```java
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class RedisUtil {
private static JedisPool jedisPool;
static {
Properties props = new Properties();
InputStream is = RedisUtil.class.getClassLoader().getResourceAsStream("redis.properties");
try {
props.load(is);
} catch (IOException e) {
e.printStackTrace();
}
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(Integer.valueOf(props.getProperty("redis.pool.maxTotal")));
jedisPoolConfig.setMaxIdle(Integer.valueOf(props.getProperty("redis.pool.maxIdle")));
jedisPoolConfig.setMinIdle(Integer.valueOf(props.getProperty("redis.pool.minIdle")));
jedisPoolConfig.setMaxWaitMillis(Long.valueOf(props.getProperty("redis.pool.maxWaitMillis")));
jedisPool = new JedisPool(jedisPoolConfig, props.getProperty("redis.host"),
Integer.valueOf(props.getProperty("redis.port")), 5000, props.getProperty("redis.password"));
}
public static Jedis getJedis() {
return jedisPool.getResource();
}
}
```
在上述代码中,读取了名为redis.properties的配置文件,并使用JedisPoolConfig配置了Jedis连接池,最后创建了一个JedisPool实例。通过调用getJedis()方法即可获取一个Jedis实例。
阅读全文