Redis
Redis是采用C语言编写,内存数据存储。
Redis读写速度异常快速,适合做应用缓存
Redis支持字符串、哈希、列表、集合、有序集合结构存储
Redis支持持久化操作(RDB和AOF机制)
Redis可以和Java、PHP、Python等语言结合访问
Redis操作命令
字符串操作(string)
set key value //设置一组key value
get key //获取value值
mset key value key value //设置多组key value
strlen key //查看value字符数量
incr key //将value值加1
incrby key n //将value值加n
decr key //将value值减1
decrby key n //将value值减n
append key value //字符串拼接
key操作
keys * //查看所有key
del key //删除key
type key //查看value类型
expire key n //指定失效时间(秒)
哈希操作(hash)
hset key field value //设置一组字段名和字段值
hmset key field1 value1 field2 value2... //设置多组字段名和字段值
hget key field //获取字段值
hmget key field1 field2 //获取多个字段值
hkeys key //查看哈希包含的字段名
hlen key //查看哈希包含的字段数量
hdel key field //删除哈希中的某个字段
列表操作(list)
lpush key value //向列表头部插入一个元素
rpush key value //向列表尾部插入一个元素
llen key //列表元素数量
lrange key 0 -1 //获取所有元素
lpop //弹出列表头部元素
集合操作
sadd key member //添加元素
srem key member //删除元素
smembers key //返回所有元素
scard key //返回集合元素数量
srandmember key n //随机返回n个
sunion key1 key2 //key1并key2
sinter key1 key2 //key1交key2
sdiff key1 key2 //key1差key2
有序集合操作
zadd key score member //添加元素
zcard key //集合元素数量
zrange key 0 -1 //由小到大顺序查看所有元素
zrevrange key 0 -1 //由大到小顺序查看所有元素
zcount key min max //按分数统计元素数量
zrem key memeber //删除元素
Java访问Redis
基于jedis.jar访问
@Test
public void test1(){
Jedis jedis = new Jedis("localhost", 6379);
System.out.println(jedis.ping());
Set keys = jedis.keys("*");//keys *
for(String key:keys){
System.out.println(key+":"+jedis.type(key));
}
jedis.close();
}
@Test
public void test2(){
Jedis jedis = new Jedis("localhost", 6379);
//取string
String value1 = jedis.get("name");//get name
System.out.println("name="+value1);
//取hash
String value2 = jedis.hget("dept10", "dname");//hget dept10 dname
System.out.println("dname="+value2);
//获取hash所有字段值
Set fields = jedis.hkeys("dept20");
for(String f:fields){
System.out.println(f+":"+jedis.hget("dept20", f));
}
jedis.close();
}
@Test
public void test3(){
Map data = new HashMap<>();
data.put("no", "101");
data.put("name", "tom");
Jedis jedis = new Jedis("localhost", 6379);
jedis.hmset("mymap1", data);//存入map
Map map = jedis.hgetAll("mymap1");//获取map
System.out.println(map.get("no")+" "+map.get("name"));
jedis.close();
}
@Test
public void test4(){
Dept dept = new Dept();
dept.setDeptno(10);
dept.setDname("Java");
dept.setLoc("北京");
Jedis jedis = new Jedis("localhost", 6379);
jedis.set("dept".getBytes(), SerializableUtil.objectToBytes(dept));
jedis.close();
}
@Test
public void test5(){
Jedis jedis = new Jedis("localhost", 6379);
byte[] bytes = jedis.get("dept".getBytes());
Dept dept = (Dept)SerializableUtil.bytesToObject(bytes);
System.out.println(dept.getDeptno()+" "+dept.getDname()+" "+dept.getLoc());
jedis.close();
}
SerializableUtil.java
public class SerializableUtil {
public static Object bytesToObject(byte[] bytes){
ByteArrayInputStream input = null;
ObjectInputStream ois = null;
try{
input = new ByteArrayInputStream(bytes);
ois = new ObjectInputStream(input);
Object obj = ois.readObject();//反序列化将字节数组转成Object
return obj;
}catch(Exception ex){
ex.printStackTrace();
return null;
}finally{
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static byte[] objectToBytes(Object obj){
ByteArrayOutputStream out = null;
ObjectOutputStream oos = null;
try{
out = new ByteArrayOutputStream();
oos = new ObjectOutputStream(out);
oos.writeObject(obj);//将obj序列化后写入out对象中
byte[] bytes = out.toByteArray();
return bytes;
}catch(Exception e){
e.printStackTrace();
return null;
}finally{
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
基于SpringData-redis访问
引入spring-data-redis包、jedis、connection-pool包
在Spring配置文件定义RedisTemplate、JedisConnectionFactory组件
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
注入RedisTemplate测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class TestRedisTemplate {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void test1(){
redisTemplate.opsForValue().set("name", "XDL");
String value = (String)redisTemplate.opsForValue().get("name");
System.out.println(value);
}
@Test
public void test2(){
Dept dept = new Dept();
dept.setDeptno(20);
dept.setDname("XDL");
dept.setLoc("北京");
redisTemplate.opsForValue().set("dept", dept);
Dept d = (Dept)redisTemplate.opsForValue().get("dept");
System.out.println(d.getDeptno()+" "+d.getDname()+" "+d.getLoc());
}
}
Redis缓存使用
@Resource
private RedisTemplate redisTemplate;
@RequestMapping(value="/dept/get",method=RequestMethod.GET)
public Dept loadDept(@RequestParam("no")int id){
//查找Redis缓存,有返回
Dept dept = (Dept)redisTemplate.opsForValue().get("dept:"+id);
//Redis没有,调用deptDao查询数据库,并将结果放入缓存
if(dept == null){
System.out.println("从数据库查询加载数据");
dept = deptDao.findById(id);
redisTemplate.opsForValue().set("dept:"+id, dept);
}else{
System.out.println("从Redis缓存查询加载数据");
}
return dept;
}