redis-java-api

 

redis的java操作api

至于redis五种数据类型, 和redis的命令操作, 和client端差不多的, 就不罗列了

代码github地址: https://github.com/wenbronk/redis-java.git

package com.iwhere.learn.redis.java;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.junit.Before;
import org.junit.Test;

import redis.clients.jedis.BinaryClient.LIST_POSITION;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.ShardedJedis;

/**
 * 使用java 操作 redis
 * @author wenbronk
 * @time 2017年3月24日  下午1:05:20  2017
 */

//@RunWith(SpringJUnit4ClassRunner.class)
//@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
public class JavaAPITest {

    private Jedis jedis;
    private ShardedJedis shardedJedis;
    
    /**
     * 获取redis的基础信息
     */
    @Test
    public void testConfiguration() {
        String ping = jedis.ping();
        System.out.println(ping);
    }
    
    
    /**
     * 对key进行操作
     */
    @Test
    public void testKey() {
        // key是否存在
        Boolean exists = jedis.exists("name");
        
        // 查看所有的key, 支持模糊查询
        Set<String> keys = jedis.keys("*");
        
        // del 删除键
        jedis.del("name");
        
        // key的数据类型
        String type = jedis.type("vini");
        
        System.out.println(type);
    }
    
    /**
     * 测试String类型的
     */
    @Test
    public void testString () {
        // set, 会发生覆盖
        String ok = jedis.set("name", "vini");    //OK
        String set = jedis.getSet("name", "被修改的值");
        // 获取value值并截取
        String getrange = jedis.getrange("name", 0, 5);
        
        // append, 直接在后面添加
        Long append = jedis.append("name", "wenbronk");
        
        
        // get
        String value = jedis.get("age");
        
        // 获取字符串的长度
        Long strlen = jedis.strlen("vini");
        
        // mset , 一次设置/获取 多个键值对
        jedis.mset("name", "vini", "age", "23");
        List<String> mget = jedis.mget("vini", "wenbronk");
        
        // 自增
        Long incr = jedis.incr("age");
        
        
        System.out.println(incr + ": " + value);
        
    }
    
    /**
     * 操作list类型的数据
     * 使用双向链表实现
     * 可用于商品评论列表
     */
    @Test
    public void testList() {
        // 左插入, 可同时插入多个值
        jedis.lpush("user", "vini", "123");
        jedis.lpush("user", "wenbronk", "456", "789");
        
        // 右插入, 可同时插入多个值
        jedis.rpush("nanan", "wenbronk", "vini");
        jedis.rpush("nanan", "who");
        
        // 在某个值之前插入
        jedis.linsert("user", LIST_POSITION.AFTER, "wenbronk", "插入新值");
        
        // 长度
        jedis.llen("user");
        
        // 角标操作
        // 获取某个角标的值
        String lindex = jedis.lindex("user", 1);
        // 修改角标的值
        jedis.lset("user", 0, "我变成第一个");
        // 获取list中某段index, 最左为0, 最右为 -1, 子串
        List<String> lrange = jedis.lrange("user", 0, 3);
        // 删除角标的值
        jedis.lrem("user", 0, "这是啥");
        // 删除区间之外的值
        jedis.ltrim("user", 2, 5);
        
        
        // 出栈
        // 两端弹出元素
        jedis.lpop("user");
        jedis.rpop("user");
        
        // 将一个列表转移到另一个列表
        jedis.rpoplpush("user", "nanan");
        
        System.out.println(lrange);
    }
    
    /**
     * 测试set集合
     * 运用是因为集合运算
     */
    @Test
    public void testSet() {
        //添加
        jedis.sadd("testSet", "1", "2", "3");
        // 删除匹配的记录
        jedis.srem("testSet", "5", "6", "7");
        // 删除key
        jedis.del("testSet");
        
        // 是否存在
        jedis.sismember("testSet", "4");
        
        // 获取
        Set<String> smembers = jedis.smembers("testSet");
        // 获取元素个数
        Long scard = jedis.scard("user");
        // 随机取一个
        String srandmember = jedis.srandmember("testSet");
        String spop = jedis.spop("testSet");    // 弹出
        
        
        // 集合运算
        // 差集, 包左不包右
        jedis.sdiff("testSet", "testSet2");
        // 并集, 数据分析
        jedis.sunion("testSet", "testSet2");
        // 交集
        jedis.sinter("testSet", "testSet2");
    }
    
    
    /**
     * 操作 hash 类型的数据
     * 类似map, 解决存储对象的问题, 但太浪费内存了, 使用hash删列实现
     * 不过现在都用json了...
     * 可用在缓存商品信息
     */
    @Test
    public void testHash() {
        // 准备数据
        Map<String,String> map = new HashMap<>();
        map.put("name","vini");
        map.put("age","24");
        map.put("birth","1992-01-26");
        
        // 赋值操作
        jedis.hmset("student", map);
        // 更新, 字段存在覆盖
        jedis.hset("student", "score", "99");
        // 字段存在不做任何操作
        jedis.hsetnx("student", "age", "25");
        // 多个字段, 字段封装在map中, 字段存在会覆盖
        jedis.hmset("student", new HashMap<>());
        
        // 取值, 根据key和字段
        String name = jedis.hget("student", "name");
        // 获取多个字段
        List<String> hmget = jedis.hmget("student", "name", "age", "birth");
        // 获取所有字段
        Map<String, String> hgetAll = jedis.hgetAll("student");
        
        // 删除, 返回被删除字段的值
//        Long hdel = jedis.hdel("student", "score", "age");
        
        // 自增, 指定字段, step
        jedis.hincrBy("student", "age", 1);
        
        // 判断字段是否存在
        jedis.hexists("student", "name");
        // 只获取字段名
        Set<String> hkeys = jedis.hkeys("student");
        // 只获取字段值
        List<String> hvals = jedis.hvals("student");
    }
    
    /**
     * 有序集合, 有序却不重复, 使用hash散列表实现
     * 内置排序, 但用的并不多
     * 可用在商品销售排行榜
     */
    @Test
    public void testZSet() {
        // 新增, 中间为分数
        jedis.zadd("zset", 10, "234");
        
        // 获取排名, 从小到大
        jedis.zrange("zset", 0, -1);
        // 从大到小获取
        jedis.zrevrange("zset", 0, -1);
        
        // 获取分数
        Double zscore = jedis.zscore("zset", "234");
        // 获取指定分数范围的元素
        jedis.zrangeByScore("zset", 80, 100);
        // 获取指定范围的个数
        jedis.zcount("zset", 80, 100);
        
        // 获取元素数量
        Long zcard = jedis.zcard("zset");
        
        // 删除元素
        jedis.zrem("zset", "234");
        // 按照排名删除
        jedis.zremrangeByRank("zset", 0, 20);
        // 按照分数范围删除
        jedis.zremrangeByScore("zset", 80, 100);
        
    }
    
    @Before
    public void testBefore() {
        jedis = RedisClientUtil.getRedisClient().getJedis();
        shardedJedis = RedisClientUtil.getRedisClient().getShardedJedis();
    }
    @Agfter
   public void testAfter() { jedis.close();    // 资源返还 }
}

 

posted @ 2017-03-27 17:58  bronk  阅读(499)  评论(0编辑  收藏  举报