1. 程式人生 > >redis簡介及其基本操作,java訪問redis

redis簡介及其基本操作,java訪問redis

println junit4 oid tac 及其 包含 序列 text ring

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<String> 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<String> fields = jedis.hkeys("dept20");
    for(String f:fields){
        System.out.println(f+":"+jedis.hget("dept20", f));
    }
    jedis.close();
}

@Test
public void test3(){

    Map<String, String> data = new HashMap<>();
    data.put("no", "101");
    data.put("name", "tom");

    Jedis jedis = new Jedis("localhost", 6379);

    jedis.hmset("mymap1", data);//存入map
    Map<String,String> 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訪問

  1. 引入spring-data-redis包、jedis、connection-pool包

  2. 在Spring配置文件定義RedisTemplate、JedisConnectionFactory組件

    <bean id="redisConnectionFactory" 
        class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="localhost">
        </property>
        <property name="port" value="6379"></property>
    </bean>
    
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="redisConnectionFactory">
        </property>
    </bean>
    
  3. 註入RedisTemplate測試

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations={"classpath:applicationContext.xml"})
    public class TestRedisTemplate {
    
        @Autowired
        private RedisTemplate<Object,Object> 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<Object, Object> 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;
}

redis簡介及其基本操作,java訪問redis