当前位置: 首页 > news >正文

Redis之Hash类型操作

接口IRedisDaoHash:

package com.net.test.redis.base.dao;

import com.net.test.redis.base.entity.UserPsg;

/**
 * @author ***
 * @Time:2017年8月9日 下午1:43:23
 * @version 1.0
 * @description redis的哈希操作
 */
public interface IRedisDaoHash {
        
    public void set(String key,UserPsg psg);
    public void get(String key,String hKye);
    public void setClazz(String key,Object cls);
    
    public void getKeys(String key);
    public void getValues(String key);
    
    public void length(String key);
    public void exists(String key,String hashKey);
    public void delete(String key, Object...hashKeys);
    
}

 

实现类:

package com.net.test.redis.base.dao.imp;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import com.net.test.redis.base.dao.IRedisDaoHash;
import com.net.test.redis.base.entity.UserPsg;
import com.net.test.redis.base.until.ClassInfo;

/**
 * @author ***
 * @Time:2017年8月9日 下午2:04:54
 * @version 1.0
 * @description
 */
@Component
public class RedisDaoHashImp implements IRedisDaoHash {
    
    @Autowired
    private RedisTemplate<String, String>  redis;
    
    /**
     * @description 设置hash的键、属性和值。此方法写的比较死,无法做到通用
     * @param key
     * @param psg
     */
    @Override
    public  void set(String key, UserPsg psg)
    { 
        HashOperations<String, String, Object> oper = redis.opsForHash();
        oper.put(key, "address", psg.getAddress());
        oper.put(key, "phone", psg.getPhone());
    }
    
    /**
     * @description 此方法利用反射技术,做到了任何pojo都可以通用此方法(目前不支持内置对象,好像redis也不支持内置对象)
     * @param key
     * @param object
     */
    @Override
    public void setClazz(String key, Object object) 
    {
        HashOperations<String, String, Object> oper = redis.opsForHash();
        ClassInfo info = new ClassInfo();
        Map<String, String> map;
        try {
            map = info.getFieldsByClass(object);
            Set<String> set = map.keySet();
            for(Iterator<String> iter = set.iterator();iter.hasNext();)
            {
                String hKey = iter.next();
                String hValue = map.get(hKey);
                oper.put(key, hKey, hValue);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }
    
    /**
     * @description 根据hash的键(key)和属性(hKye)查询出对应的属性
     * @param key
     * @param hKye
     */
    @Override
    public void get( String key, String hKye) 
    {
        HashOperations<String, String, Object> oper = redis.opsForHash();
        String value = (String) oper.get(key, hKye);
        System.out.println("hash 的get方法获取值 :" + value);
    }
    
    /**
     * @description 获取键(key)下面的所有属性
     * @param key
     */
    @Override
    public void getKeys(String key) {
        HashOperations<String, String, Object> oper = redis.opsForHash();
        Set<String> set = oper.keys(key);
        
        System.out.println( key + "下面的键有:");
        for(Iterator<String> iter = set.iterator();iter.hasNext();)
        {
            String _key = iter.next();
            System.out.println(_key);
        }
    }
    
    /**
     * @description 获取键(key)下面的所有值
     * @param key
     */
    @Override
    public void getValues(String key)
    {
        HashOperations<String, String, Object> oper = redis.opsForHash();
        List<Object> list = oper.values(key);
        
        System.out.println( key + "下面的键有:");
        for(Iterator<Object> iter = list.iterator();iter.hasNext();)
        {
            String _key = iter.next().toString();
            System.out.println(_key);
        }
    }

    /**
     * @description 根据键获取属性个数
     * @param key
     */
    @Override
    public void length(String key) {
        HashOperations<String, String, Object> oper = redis.opsForHash();
        int size = oper.size(key).intValue();
        System.out.println(key + "属性共有 :"+ size);
    }
    
    /**
     * @description 判断键是否存在
     * @param key
     * @param hashKey
     */
    @Override
    public void exists(String key,String hashKey) {
        HashOperations<String, String, Object> oper = redis.opsForHash();
        boolean b =    oper.hasKey(key, hashKey);
        System.out.println(key + "下面的" +hashKey + "属性:" + b);
    }
    
    /**
     * @description 删除指定的键(key)下面的属性(hashKeys)
     * @param key
     * @param hashKeys
     */
    @Override
    public void delete(String key, Object...hashKeys) {
        HashOperations<String, String, Object> oper = redis.opsForHash();
        oper.delete(key,hashKeys);
    }

    
}

 

反射依赖方法,自己封装的:

package com.net.test.redis.base.until;

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

/**
 * @author ****
 * @Time:2017年8月9日 下午3:16:37
 * @version 1.0
 * @description 反射基类
 */

public class ClassInfo {
    
    /**
     * @description 利用反射,读取pojo属性以及get**方法
     * @param object
     * @return
     * @throws Exception
     */
    public Map<String,String> getFieldsByClass(Object object) throws Exception
    {
        Map<String,String> map = new HashMap<String,String>();
        Class<?> clazz = object.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for(int i = 0; i < fields.length; i++)
        {
            String key = fields[i].getName();
            String Ukey = key.replace(key.substring(0, 1), key.substring(0, 1).toUpperCase());
            String value = "get" + Ukey ;
            
            Method method = clazz.getDeclaredMethod(value);
            Object obj = method.invoke(object);
            
            map.put(key, obj.toString());
        }
        return map;    
    }
    
}

 

转载于:https://www.cnblogs.com/chen1-kerr/p/7326829.html

相关文章:

  • 转进制
  • Java web 项目读取src或者tomcat下class文件夹下的xml文件或者properties文件
  • jQuery遍历之prev()方法
  • 文本显示为单行,超过部分隐藏并使用省略号
  • codeforces 837B
  • 【javascript】函数中的this的四种绑定形式 — 大家准备好瓜子,我要讲故事啦~~...
  • 2017ACM暑期多校联合训练 - Team 6 1001 HDU 6096 String (字符串处理 字典树)...
  • python三级菜单
  • jquery ajax添加元素事件无效,each,on函数参考
  • js 判断确切判断Array和Object
  • s7day1学习记录
  • Eclipse配置文件描述
  • C#6.0VISUALSTUDIO 2015 C#入门经典 第7版pdf
  • Navicat Premium连接各种数据库
  • 8.19-星期五
  • SegmentFault for Android 3.0 发布
  • [nginx文档翻译系列] 控制nginx
  • 230. Kth Smallest Element in a BST
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Apache Zeppelin在Apache Trafodion上的可视化
  • flutter的key在widget list的作用以及必要性
  • Java编程基础24——递归练习
  • js 实现textarea输入字数提示
  • node学习系列之简单文件上传
  • Objective-C 中关联引用的概念
  • 爱情 北京女病人
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 精彩代码 vue.js
  • 说说动画卡顿的解决方案
  • 王永庆:技术创新改变教育未来
  • nb
  • PostgreSQL之连接数修改
  • #includecmath
  • #Java第九次作业--输入输出流和文件操作
  • #Spring-boot高级
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (差分)胡桃爱原石
  • (二)Linux——Linux常用指令
  • (二)pulsar安装在独立的docker中,python测试
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (转)h264中avc和flv数据的解析
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)创业家杂志:UCWEB天使第一步
  • (转)负载均衡,回话保持,cookie
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .NET运行机制
  • @Bean注解详解
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?