Jedis
Jedis
Jedis is a blazingly small and sane redis java client.
功能
Sorting
Connection handling
Commands operating on any kind of values
Commands operating on string values
Commands operating on hashes
Commands operating on lists
Commands operating on sets
Commands operating on sorted sets
Transactions
Pipelining
Publish/Subscribe
Persistence control commands
Remote server control commands
Connection pooling
Sharding (MD5, MurmurHash)
Key-tags for sharding
Sharding with pipelining
Scripting with pipelining
Redis Cluster
Docker 安装 Redis
基础知识
删除原始的
一条命令实现停用并删除容器:
ps: 危险操作,切勿模仿。
docker stop $(docker ps -a -q) & docker rm $(docker ps -a -q)
实际安装
- 验证是否存在
$ docker images | grep redis
发现没有了,也许是刚更新了 Docker 的原因。
- 下载
$ docker pull redis
- 再次查看
$ docker images | grep redis
redis latest e1a73233e3be 40 hours ago 83.4MB
- 启动
docker run -p 6379:6379 --name out-redis -d redis
- 状态查看
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b8dfa9422adb redis "docker-entrypoint.s…" 14 seconds ago Up 13 seconds 0.0.0.0:6379->6379/tcp out-redis
Jedis
使用 java 语言测试,结合 maven 进行 jar 管理。
jdk8 + junit4
jar 引入
redis.clients
jedis
2.8.1
测试代码
public class RedisTest {
private Jedis jedis;
@BeforeEach
public void setUp() {
jedis = new Jedis("127.0.0.1", 6379);
// jedis.auth("123456");
}
/**
* 初始化测试
*/
@Test
public void initTest() {
jedis.set("key", "test");
System.out.println(jedis.get("key"));
}
}
- 输出日志
test
常见例子
为了测试的自动化,使用断言。
- crud
@Test
public void testCrudString() {
jedis.set("name", "ryo");
assertEquals("ryo", jedis.get("name"));
jedis.append("name", " is whose name?");
assertEquals("ryo is whose name?", jedis.get("name"));
jedis.del("name");
assertNull(jedis.get("name"));
jedis.mset("name", "ryo", "age", "22");
assertEquals("ryo", jedis.get("name"));
jedis.incr("age");
assertEquals("23", jedis.get("age"));
}
- map
@Test
public void testMap() {
Map map = new HashMap<>();
map.put("name", "ryo");
map.put("age", "22");
jedis.hmset("map", map);
assertEquals("[ryo, 22]", jedis.hmget("map", "name", "age").toString());
assertEquals("2", jedis.hlen("map").toString());
assertEquals("true", jedis.exists("map").toString());
assertEquals("[name, age]", jedis.hkeys("map").toString());
jedis.hdel("map", "name");
assertEquals("1", jedis.hlen("map").toString());
}
- list
@Test
public void testList() {
jedis.del("list");
jedis.lpush("list", "apple");
jedis.lpush("list", "eat");
jedis.lpush("list", "ryo");
assertEquals("apple", jedis.lindex("list", 2));
jedis.lset("list", 2, "orange");
assertEquals("[ryo, eat, orange]", jedis.lrange("list", 0, -1).toString());
}
- set
@Test
public void testSet() {
jedis.del("name");
jedis.sadd("name", "ryo");
jedis.sadd("name", "apple");
jedis.sadd("name", "orange");
assertEquals("[orange, apple, ryo]", jedis.smembers("name").toString()); //show all members.
assertEquals("3", jedis.scard("name").toString()); //get number
jedis.srem("name", "orange"); //remove
assertEquals("[apple, ryo]", jedis.smembers("name").toString());
assertEquals("false", jedis.sismember("name", "banana").toString());
assertEquals("[ryo, apple]", jedis.srandmember("name", 2).toString());
}
- sort
@Test
public void testSort() {
jedis.del("sort");
jedis.lpush("sort", "3");
jedis.lpush("sort", "5");
jedis.lpush("sort", "2");
jedis.lpush("sort", "7");
assertEquals("[7, 2, 5, 3]", jedis.lrange("sort", 0, -1).toString());
assertEquals("[2, 3, 5, 7]", jedis.sort("sort").toString());
assertEquals("[7, 2, 5, 3]", jedis.lrange("sort", 0, -1).toString());
}
Jedis
- pom.xml
4.0.0
com.ryo
redis
1.0-SNAPSHOT
UTF-8
2.2
2.18.1
3.3
1.8
2.6
junit
junit
4.9
test
redis.clients
jedis
2.8.1
commons-pool
commons-pool
1.6
org.apache.tomcat.maven
tomcat7-maven-plugin
${plugin.tomcat.version}
8080
/
${project.build.sourceEncoding}
org.apache.maven.plugins
maven-surefire-plugin
${maven-surefire-plugin.version}
true
true
org.apache.maven.plugins
maven-compiler-plugin
${maven-compiler-plugin.version}
${maven-compiler-plugin.jdk.version}
${maven-compiler-plugin.jdk.version}
- RedisTest.java
package com.ryo.redis;
import junit.framework.TestCase;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.Map;
/**
* Created by houbinbin on 16/7/3.
*/
public class RedisTest extends TestCase {
private Jedis jedis;
@Before
public void setUp() {
jedis = new Jedis("127.0.0.1", 6379);
jedis.auth("redis");
}
/**
* save String
*/
@Test
public void testSaveString() {
jedis.set("name", "ryo");
assertEquals("ryo", jedis.get("name"));
jedis.append("name", " is whose name?");
assertEquals("ryo is whose name?", jedis.get("name"));
jedis.del("name");
assertEquals(null, jedis.get("name"));
jedis.mset("name", "ryo", "age", "22");
assertEquals("ryo", jedis.get("name"));
jedis.incr("age");
assertEquals("23", jedis.get("age"));
}
/**
* Map
*/
@Test
public void testMap() {
Map map = new HashMap<>();
map.put("name", "ryo");
map.put("age", "22");
jedis.hmset("map", map);
assertEquals("[ryo, 22]", jedis.hmget("map", "name", "age").toString());
assertEquals("2", jedis.hlen("map").toString());
assertEquals("true", jedis.exists("map").toString());
assertEquals("[name, age]", jedis.hkeys("map").toString());
assertEquals("[ryo, 22]", jedis.hvals("map").toString());
jedis.hdel("map", "name");
assertEquals("1", jedis.hlen("map").toString());
}
/**
* List
*/
@Test
public void testList() {
jedis.del("list");
jedis.lpush("list", "apple");
jedis.lpush("list", "eat");
jedis.lpush("list", "ryo");
assertEquals("apple", jedis.lindex("list", 2));
jedis.lset("list", 2, "orange");
assertEquals("[ryo, eat, orange]", jedis.lrange("list", 0, -1).toString());
}
/**
* Set
*/
@Test
public void testSet() {
jedis.del("name");
jedis.sadd("name", "ryo");
jedis.sadd("name", "apple");
jedis.sadd("name", "orange");
assertEquals("[orange, apple, ryo]", jedis.smembers("name").toString()); //show all members.
assertEquals("3", jedis.scard("name").toString()); //get number
jedis.srem("name", "orange"); //remove
assertEquals("[apple, ryo]", jedis.smembers("name").toString());
assertEquals("false", jedis.sismember("name", "banana").toString());
//get the random result, so assert may be false.
assertEquals("apple", jedis.srandmember("name"));
assertEquals("[ryo, apple]", jedis.srandmember("name", 2).toString());
}
/**
* sort
*/
@Test
public void testSort() {
jedis.del("sort");
jedis.lpush("sort", "3");
jedis.lpush("sort", "5");
jedis.lpush("sort", "2");
jedis.lpush("sort", "7");
assertEquals("[7, 2, 5, 3]", jedis.lrange("sort", 0, -1).toString());
assertEquals("[2, 3, 5, 7]", jedis.sort("sort").toString());
assertEquals("[7, 2, 5, 3]", jedis.lrange("sort", 0, -1).toString());
}
}
Jedis pool
I try times, but always get an error.
package com.ryo.util;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* Created by houbinbin on 16/7/3.
*/
public class RedisUtil {
private RedisUtil() {
}
private static final String ADDRESS = "127.0.0.1";
private static final int PORT = 6397;
private static final String PASSWORD = "redis";
//可用连接实例的最大数目,默认值为8;
//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
private static final int MAX_TOTAL = 512;
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
private static final int MAX_IDLE = 100;
//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
private static final int TIMEOUT = 10000;
//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
private static final boolean TEST_ON_BORROW = true;
private static JedisPool jedisPool = null;
/**
* 初始化Redis连接池
*/
static {
try {
if (jedisPool == null) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(MAX_TOTAL);
config.setMaxWaitMillis(TIMEOUT);
config.setMaxIdle(MAX_IDLE);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config, ADDRESS, PORT, TIMEOUT, PASSWORD);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("init redis pool failed!");
}
}
/**
* 获取Jedis实例
*
* @return
*/
public synchronized static Jedis getJedis() {
try {
if (jedisPool != null) {
Jedis resource = jedisPool.getResource();
return resource;
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
}
}
/**
* 释放jedis资源
*
* @param jedis
*/
public static void returnResource(final Jedis jedis) {
if (jedis != null) {
jedisPool.returnResource(jedis);
}
}
}
Spring-Redis
No invasive spring and redis integration.
@Cacheable
triggers cache population
@CacheEvict
triggers cache eviction
@CachePut
updates the cache without interfering with the method execution
@Caching
regroups multiple cache operations to be applied on a method
@CacheConfig
shares some common cache-related settings at class-level
简单说下@Cacheable
和@CachePut
区别:
(1) @Cacheable
如果缓存中有,直接去缓存,不执行方法。否则执行方法,并将结果放在缓存中。适用于如查询的情况。
(2) @CachePut
无论缓存有没有,方法会正常执行。并将返回的结果放在缓存之中。适用于更新情况,并将更新后的对象放在缓存中。
- File struct
You can get the project demo from here or git clone https://github.com/houbb/spring-redis
.
|____main
| |____java
| | |____com
| | | |____ryo
| | | | |____cache
| | | | | |____RedisCacheConfig.java
| | | | |____domain
| | | | | |____User.java
| | | | |____service
| | | | | |____impl
| | | | | | |____UserServiceImpl.java
| | | | | |____UserService.java
| |____resources
| | |____app.xml
| | |____applicationContext.xml
| | |____spring-redis.xml
|____test
| |____java
| | |____com
| | | |____ryo
| | | | |____service
| | | | | |____BaseTest.java
| | | | | |____UserServiceTest.java
|____pom.xml
pom.xml
4.0.0
com.ryo
spring-redis
1.0-SNAPSHOT
spring integrate redis
4.9
4.2.6.RELEASE
1.3.2.RELEASE
2.4.2
1.16.8
2.18.1
junit
junit
${junit.version}
org.springframework
spring-core
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-test
${spring.version}
org.springframework.data
spring-data-redis
${spring-data-redis.version}
redis.clients
jedis
${jedis.version}
org.projectlombok
lombok
${lombok.version}
provided
org.apache.maven.plugins
maven-surefire-plugin
${maven-surefire-plugin.version}
true
true
User.java
@Data
public class User implements Serializable {
private Long id;
private String name;
}
UserServiceImpl.java
@Service("userService")
public class UserServiceImpl implements UserService {
/**
* @Cacheable triggers cache population
*/
@Cacheable(value = "user", key = "'user_id_' + #id")
public User getUser(Long id) {
System.out.println("get user"+id);
User user = new User();
user.setId(id);
return user;
}
@CacheEvict(value = "user", key = "'user_id_'+#id")
public void deleteUser(Long id) {
System.out.println("delete user"+id);
}
/**
* updated without interfering with the method execution
* - 将返回的结果,放入缓存
*/
@CachePut(value = "user", key = "'user_id_'+#user.getId()")
public User updateUser(User user) {
System.out.println("update user"+user);
user.setName("cachePut update");
return user;
}
@CacheEvict(value = "user", allEntries = true)
public void clearCache() {
System.out.println("clear all user cache");
}
}
CacheConfig.java
@Configuration
@EnableCaching
public class RedisCacheConfig {
private JedisConnectionFactory jedisConnectionFactory;
private RedisTemplate redisTemplate;
private RedisCacheManager redisCacheManager;
public RedisCacheConfig(JedisConnectionFactory jedisConnectionFactory, RedisTemplate redisTemplate, RedisCacheManager redisCacheManager) {
this.jedisConnectionFactory = jedisConnectionFactory;
this.redisTemplate = redisTemplate;
this.redisCacheManager = redisCacheManager;
}
}
app.xml
applicationContext.xml
spring-redis.xml