package redis;

import redis.clients.jedis.Jedis;

public class BaseBO {
    private static final String SYSKEY = "0000:";
    public Jedis getJedis(){
        return XedisClient.getClient();
    }
    public static String genSys(Object...objects){
        return SYSKEY+XedisClient.genKey(objects);
    }
    public static Object getBean(String key, Object obj) throws Exception{
        return XedisClient.getBean(key, obj);
    }
    public static String setBean(String key, Object obj) throws Exception{
        return XedisClient.setBean(key, obj);
    }
}
package redis;

import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisPool2 extends JedisPool{

    public JedisPool2(JedisPoolConfig config,String url,int port){
        super(config, url,port);
    }
}
package redis;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.ConvertUtilsBean;

import net.sf.json.JSONObject;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.exceptions.JedisConnectionException;

public class XedisClient {
    
    private static JedisPool2 pool = new JedisPool2(new JedisPoolConfig(),"127.0.1",6379);
    private static ThreadLocal<Jedis> myClient = new ThreadLocal();
    private static int reset = 3;
    private static Map<String, Field[]> clsMap = new HashMap<String, Field[]>();
    //从线程池中获取实例,如果没有就从连接池中获取实例
    private static Jedis myClient(){
        int count = 0;
        Jedis jedis = null;
        while(jedis==null && count<3){
            try{
                jedis = myClient.get();
                if(jedis ==null){
                    jedis = getClient();
                    myClient.set(jedis);
                }
            }catch(JedisConnectionException e){
                returnBrokenResource(jedis);
                try{
                    Thread.sleep(3000);
                }catch(InterruptedException e1){
                    e1.printStackTrace();
                }
            }
        }
        return jedis;
    }
    //从连接池中获取实例
    public static Jedis getClient(){
        return pool.getResource();
    }
    //将Jedis对象使用后返回给连接池
    public static void returnBrokenResource(Jedis j){
        pool.returnBrokenResource(j);
    }
    //在用完连接池时,要手动关闭
    public static void closePool(){
        pool.destroy();
    }
    //获取参数组合后的键结构
    public static String genKey(Object...objects){
        StringBuffer sb = new StringBuffer();
        for(Object o:objects){
            if(sb.length()>0){
                sb.append(":");
            }
            sb.append(o);
        }
        return sb.toString();
    }
    //获取实例
    public static Object getBean(String key, Object obj) throws Exception{
        map2obj(myClient().hgetAll(key),obj);
        return obj;
    }
    //保存实例
    public static String setBean(String key, Object obj) throws Exception{
        String ret = myClient().hmset(key, obj2map(obj));
        return ret;
    }
    //将获取的实例转换为对象
    public static void map2obj(Map<String, String> map,Object obj) throws Exception{
        if(map==null|| map.isEmpty()){
            return;
        }
        //构建类型转换器
        ConvertUtilsBean cub = new ConvertUtilsBean();
        //利用反射机制获取对象的类
        Class clazz = obj.getClass();
        //获取已存的对象的字段
        Field[] fieldlist = clsMap.get(clazz.getName());
        if(fieldlist==null){//如果没有该类的对应值则重新添加
            fieldlist = clazz.getDeclaredFields();
            clsMap.put(clazz.getName(), fieldlist);
        }
        for(int i=0;i<fieldlist.length;i++){
            Field field = fieldlist[i];
            String value = map.get(field.getName());
            Object val;
            if(value==null){
                continue;
            }
            val = cub.convert(value, field.getType());
            field.set(obj, val);
        }
    }
    //将实例转换为字符串
    public static Map<String, String> obj2map(Object obj) throws Exception{
        Map<String, String> map = new HashMap<String, String>();
        if(obj == null){
            return null;
        }
        Class clazz = obj.getClass();
        //声明类中public、private和protected的所有字段
        Field[] fieldlist = clsMap.get(clazz.getName());
        if(fieldlist==null){
            fieldlist = clazz.getDeclaredFields();
            clsMap.put(clazz.getName(), fieldlist);
        }
        //定义转换工具
        ConvertUtilsBean cub = new ConvertUtilsBean();
        //获取实例对象的字段值
        for(int i=0;i<fieldlist.length;i++){
            Field field = fieldlist[i];
            Object value = field.get(obj);
            if(value == null || value.getClass().isArray()){
                continue;
            }
            map.put(field.getName(), cub.convert(value));
        }
        return map;
    }
}
package dao;

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

import entity.Grades;
import entity.Student;
import entity.Teacher;
import net.sf.json.JSONObject;
import redis.BaseBO;

public class RedisDao extends BaseBO{
    public static void main(String[] args) throws Exception{
        RedisDao dao = new RedisDao();
        Student stu = new Student();
        }
    
    private static final String H_TEA = "H_TEACHER";
    private static final String H_STU = "H_STUDENT";
    private static final String H_GRA = "H_GRADE";
    private static final String H_EMP = "H_EMPLOYEES";
    private static final String H_COM = "H_COMPANY";
    private static final String H_DEPT = "H_DEPT";
    
    
/*哈希表的操作:field+value、field+value(包括list)*/
    //添加实例field+value+使用hmset()函数
    public boolean saveStudent(Student stu) throws Exception{
        boolean flag = false;
        String result = setBean(genSys(H_STU,stu.getStuid()),stu);
        if(result == null){
            return flag;
        }
        flag = true;
        return flag;
        }
    //添加实例field+value(list)+使用hset()函数
    public boolean saveGrades(Grades gra) throws Exception{
        boolean flag = false;
        JSONObject jsonobj = JSONObject.fromObject(gra);
        getJedis().hset(genSys(H_GRA), gra.getName(), jsonobj.toString());
        flag = true;
        return flag;
        }
    //多实例查询每个实例一个field
    public Map<String,String> findGrades(){
        return getJedis().hgetAll(genSys(H_GRA));
    }
    //单个实例查询每个实例一个field
    public String findGrade(String field){
        String jsonobj = getJedis().hget(genSys(H_GRA), field);
        return jsonobj;
    }
    //单实例查询每个实例有多个field
    public Student findStudent(String key) throws Exception{
        Student stu = new Student();
        return (Student) getBean(genSys(H_STU,key),stu);
    }
    //更新数据
    public boolean updateStudent(Student stu) throws Exception{
        boolean flag = false;
        String result = setBean(genSys(H_STU,stu.getStuid()),stu);
        if(result==null){
             flag = true;
        }
        return flag;
    }
    //删除实例中的信息
    public boolean deleteStudent(int id,String name){
        boolean flag = false;
        getJedis().hdel(genSys(H_STU,id),name);
        return flag;
    }

    
/*list的操作*/
    //添加实例+在结尾处加入元素
    public void saverightstuid(String key,String id){
        getJedis().rpush(genSys(H_EMP,key), id);
    }
    //添加实例+在开始处加入元素
    public void saveleftstuid(String key,String id){
        getJedis().lpush(genSys(H_EMP,key), id);
    }
    //删除实例并返回实例从左侧
    public String deleteleftStuid(String key){
        return getJedis().lpop(genSys(H_EMP,key));
    }
    //删除元素从右侧
    public String deleterightStuid(String key){
        return getJedis().rpop(genSys(H_EMP,key));
    }
    //查询实例
    public List<String> findStuid(String key, int start, int end){
        return getJedis().lrange(genSys(H_EMP,key), start, end);
    }
    //获取单实例
    public String findSingleStuid(String key, int index){
        return getJedis().lindex(genSys(H_EMP,key), index);
    }
    //保留一定数量的元素
    public void keepStuid(String key, int start, int end){
        getJedis().ltrim(genSys(H_EMP,key), start, end);
    }
    //更新实例
    public void updateStuid(String key, int index, String value){
        getJedis().lset(genSys(H_EMP,key), index, value);
    }

    
/*Set的操作*/
    //添加元素
    public void saveCompany(String key,String menber){
        getJedis().sadd(genSys(H_COM,key), menber);
    }
    //添加多个元素
    public void saveCompanys(String key,String[] menbers){
        getJedis().sadd(genSys(H_COM,key), menbers);
    }
    //查询key中的全部元素
    public Set<String> findCompanySet(String key){
        Set<String> set = getJedis().smembers(genSys(H_COM,key));
        return set;
    }
    //删除元素
    public void deleteCompany(String key,String menber){
        getJedis().srem(genSys(H_COM,key), menber);
    }
    //删除一个键
    public void deleteCompanys(String key){
        getJedis().del(genSys(H_COM,key));
    }
    
    
/*Sorted Set的操作*/
    //添加单个元素
    public void saveDept(String key, int score, String menber){
        getJedis().zadd(genSys(H_DEPT,key), score, menber);
    }
    //添加多个元素
    public void saveDepts(String key, Map<Double, String> map){
        getJedis().zadd(genSys(H_DEPT,key), map);
    }
    //查询单个元素
    public String findDept(String key, int score){
        Set<String> set = getJedis().zrange(genSys(H_DEPT,key), score, score+1);
        String dept = set.iterator().next();
        return dept;
    }
    //查询键的多个元素
    public Set<String> findDepts(String key, int start, int end){
        Set<String> set = getJedis().zrange(genSys(H_DEPT,key), start, end);
        return set;
    }
    //删除一个键的多个元素通过index删除
    public void deleteDepts(String key, int start, int end){
        getJedis().zremrangeByRank(genSys(H_DEPT,key), start, end);
    }
    //删除一个键的多个元素通过score
    public void deleteDeptByScore(String key, int start, int end){
        getJedis().zremrangeByScore(genSys(H_DEPT,key), start, end);
    }
    //更新元素的score
    public void updateDeptScore(String key, int score, String member){
        getJedis().zadd(genSys(H_DEPT,key), score, member);
    }
    //更新元素的member
    public void updateDeptMember(String key, String member){
        getJedis().zincrby(genSys(H_DEPT,key), 0, member);
    }
}
package entity;

import java.util.List;

public class Grades {

    public String name;
    public String id;
    public List<Student> list;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public List<Student> getList() {
        return list;
    }
    public void setList(List<Student> list) {
        this.list = list;
    }
    
}
package entity;


public class Student {

    public int stuid;
    public int getStuid() {
        return stuid;
    }
    public void setStuid(int stuid) {
        this.stuid = stuid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public int getBirthday() {
        return birthday;
    }
    public void setBirthday(int birthday) {
        this.birthday = birthday;
    }
    public String name;
    public String sex;
    public int birthday;
}
package entity;

import java.util.List;

public class Teacher {

    public String id;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public List<Student> getStudent() {
        return student;
    }
    public void setStudent(List<Student> student) {
        this.student = student;
    }
    public String name;
    public List<Student> student;
}