ssm redis 数据字典在J2EE中的多种应用与实现

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 数据字典在项目中是不可缺少的“基础设施”,关于数据字典如何设计如何实现,今天抽空讲一下吧先看一下表设计:通过自定义标签来实现页面的渲染:public class DataDictValueTag extends SimpleTagSupport { private String...

数据字典在项目中是不可缺少的“基础设施”,关于数据字典如何设计如何实现,今天抽空讲一下吧

先看一下表设计:

通过自定义标签来实现页面的渲染:

public class DataDictValueTag extends SimpleTagSupport {

    private String typeCode;

    private String ddKey;
    
    StringWriter sw = new StringWriter();
    
    public void doTag() throws JspException, IOException {
        if (StringUtils.isNotEmpty(typeCode) && StringUtils.isNotEmpty(ddKey)) {
            
            DataDictService ddService = (DataDictService)SpringContextUtil.getBean(DataDictService.class);
            String ddValue = ddService.queryDataDictValueByCodeKey(typeCode, ddKey);
            
            JspWriter out = getJspContext().getOut();
            out.println(ddValue);
        } else {
            getJspBody().invoke(sw);
            getJspContext().getOut().println(sw.toString());
        }
    }

    public String getTypeCode() {
        return typeCode;
    }

    public void setTypeCode(String typeCode) {
        this.typeCode = typeCode;
    }

    public String getDdKey() {
        return ddKey;
    }

    public void setDdKey(String ddKey) {
        this.ddKey = ddKey;
    }

}

再看一下service,根据字典码和数据字典key来获取具体的值:

需要注意的是数据字典属于静态数据,要放到redis中

@Override
    public String queryDataDictValueByCodeKey(String typeCode, String ddKey) {
        String redisKey = "redis_datadict:" + typeCode + ":" + ddKey;
        // 从缓存中获取数据字典的值,如果没有该值,则从数据库中获取,最后再存入redis中
        String redisDdvalue = jedis.get(redisKey);
        if (StringUtils.isNotEmpty(redisDdvalue)) {
            return redisDdvalue;
        }
        
        DataDictExample dataDictExample = new DataDictExample();
        Criteria dataDictCriteria = dataDictExample.createCriteria();
        dataDictCriteria.andTypeCodeEqualTo(typeCode);
        dataDictCriteria.andDdkeyEqualTo(ddKey);
        dataDictCriteria.andIsShowEqualTo(YesOrNo.YES.value);
        List<DataDict> list = dataDictMapper.selectByExample(dataDictExample);
        if (list != null && list.size() > 0) {
            DataDict dd = (DataDict)list.get(0);
            
            String ddvalue = dd.getDdvalue();
            // 在Redis中设置数据字典的值
            jedis.set(redisKey, ddvalue);
            
            return ddvalue;
        }
        
        return "";
    }

再JSP中的使用:

<label>
                                                <input type="radio" name="sex" class="icheck" value="0" /> <dataDict:dataDictValue typeCode="sex" ddKey="0"/>
                                            </label>
                                            
                                            <label>
                                                <input type="radio" name="sex" class="icheck" value="1" /> <dataDict:dataDictValue typeCode="sex" ddKey="1"/>
                                            </label>
                                             
                                            <label>
                                                <input type="radio" name="sex" class="icheck" value="2" checked="checked"/> <dataDict:dataDictValue typeCode="sex" ddKey="2"/>
                                            </label>

如果是用jqgrid类似这样的js插件来渲染的话,那么需要再额外自定义api接口供js或者其他应用调用:

{ name: 'sex', index: 'sex', width: 20, sortable: false,
                    formatter:function(cellvalue, options, rowObject) {
                        
                        var typeCode = "sex";
                        var ddkey = cellvalue;
                        var ddvalue = "";
                        
                        $.ajax({
                            url: $("#hdnContextPath").val() + "/dataDict/queryDataDictValue.action",
                            type: "POST",
                            async: false,
                            data: {"typeCode": typeCode, "ddkey": ddkey},
                            success: function(data) {
                                if(data.status == 200 && data.msg == "OK") {
                                    ddvalue = data.data;
                                } else {
                                    console.log(JSON.stringify(data));
                                }
                            },
                            error: function (response, ajaxOptions, thrownError) {
                                Error.displayError(response, ajaxOptions, thrownError);                
                            }
                        });
                        
                        return ddvalue}  
                },

基本上就是这些用法了,具体我录制了一些视频,代码也上传到了github
http://www.itzixi.com/course/detail.shtml?courseId=17092078Y3009WX4

https://github.com/leechenxiang/LeeCX

 

相关文章
|
1月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
194 86
|
5月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
1月前
|
存储 缓存 监控
Redis分区的核心原理与应用实践
Redis分区通过将数据分散存储于多个节点,提升系统处理高并发与大规模数据的能力。本文详解分区原理、策略及应用实践,涵盖哈希、范围、一致性哈希等分片方式,分析其适用场景与性能优势,并探讨电商秒杀、物联网等典型用例,为构建高性能、可扩展的Redis集群提供参考。
90 0
|
5月前
|
数据采集 存储 NoSQL
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
334 67
|
3月前
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
431 2
|
4月前
|
NoSQL 网络协议 Java
【Azure Redis】Redis服务端的故障转移(Failover)导致客户端应用出现15分钟超时问题的模拟及解决
在使用 Azure Cache for Redis 服务时,因服务端维护可能触发故障转移。Linux 环境下使用 Lettuce SDK 会遇到超时 15 分钟的已知问题。本文介绍如何通过重启 Primary 节点主动复现故障转移,并提供多种解决方案,包括调整 TCP 设置、升级 Lettuce 版本、配置 TCP_USER_TIMEOUT 及使用其他 SDK(如 Jedis)来规避此问题。
175 1
|
4月前
|
存储 缓存 NoSQL
告别数据僵尸!Redis实现自动清理过期键值对
在数据激增的时代,Redis如同内存管理的智能管家,支持键值对的自动过期功能,实现“数据保鲜”。通过`EXPIRE`设定生命倒计时、`TTL`查询剩余时间,结合惰性删除与定期清理策略,Redis高效维护内存秩序。本文以Python实战演示其过期机制,并提供最佳实践指南,助你掌握数据生命周期管理的艺术,让数据优雅退场。
288 0
|
7月前
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用的算法是哈希槽分区算法。Redis集群中有16384个哈希槽(槽的范围是 0 -16383,哈希槽),将不同的哈希槽分布在不同的Redis节点上面进行管理,也就是说每个Redis节点只负责一部分的哈希槽。在对数据进行操作的时候,集群会对使用CRC16算法对key进行计算并对16384取模(slot = CRC16(key)%16383),得到的结果就是 Key-Value 所放入的槽,通过这个值,去找到对应的槽所对应的Redis节点,然后直接到这个对应的节点上进行存取操作
|
7月前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致 2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中 这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题,⽐如线程1删除了 Redis缓存数据,正在更新Mysql,此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中 1. 使用MQ异步同步, 保证数据的最终一致性 我们项目中会根据业务情况 , 使用不同的方案来解决Redis和Mysql的一致性问题 : 1. 对于一些一致性要求不高的场景 , 不做处理例如 : 用户行为数据 ,
|
7月前
|
NoSQL Redis
Redis的数据淘汰策略有哪些 ?
Redis 提供 8 种数据淘汰策略: 淘汰易失数据(具有过期时间的数据) 1. volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 2. volatile-lfu(least frequently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰 3. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 4. volatile-random:从已设置过期