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

 

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
NoSQL Redis
Redis的数据淘汰策略有哪些 ?
Redis 提供了 8 种数据淘汰策略,分为淘汰易失数据和淘汰全库数据两大类。易失数据淘汰策略包括:volatile-lru、volatile-lfu、volatile-ttl 和 volatile-random;全库数据淘汰策略包括:allkeys-lru、allkeys-lfu 和 allkeys-random。此外,还有 no-eviction 策略,禁止驱逐数据,当内存不足时新写入操作会报错。
118 16
|
1月前
|
NoSQL 安全 测试技术
Redis游戏积分排行榜项目中通义灵码的应用实战
Redis游戏积分排行榜项目中通义灵码的应用实战
59 4
|
6天前
|
缓存 NoSQL Redis
Redis经典问题:数据并发竞争
数据并发竞争是大流量系统(如火车票系统、微博平台)中常见的问题,可能导致用户体验下降甚至系统崩溃。本文介绍了两种解决方案:1) 加写回操作加互斥锁,查询失败快速返回默认值;2) 保持多个缓存备份,减少并发竞争概率。通过实践案例展示,成功提高了系统的稳定性和性能。
|
6天前
|
缓存 监控 NoSQL
Redis经典问题:数据不一致
在使用Redis时,缓存与数据库数据不一致会导致应用异常。主要原因包括缓存更新失败、Rehash异常等。解决方案有:重试机制、缩短缓存时间、优化写入策略、建立监控报警、定期验证一致性、采用缓存分层及数据回滚恢复机制。这些措施可确保数据最终一致性,提升应用稳定性和性能。
|
1月前
|
监控 NoSQL 网络协议
【Azure Redis】部署在AKS中的应用,连接Redis高频率出现timeout问题
查看Redis状态,没有任何异常,服务没有更新,Service Load, CPU, Memory, Connect等指标均正常。在排除Redis端问题后,转向了AKS中。 开始调查AKS的网络状态。最终发现每次Redis客户端出现超时问题时,几乎都对应了AKS NAT Gateway的更新事件,而Redis服务端没有任何异常。因此,超时问题很可能是由于NAT Gateway更新事件导致TCP连接被重置。
|
1月前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
69 14
|
1月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
44 5
|
1月前
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用哈希槽分区算法,共有16384个哈希槽,每个槽分配到不同的Redis节点上。数据操作时,通过CRC16算法对key计算并取模,确定其所属的槽和对应的节点,从而实现高效的数据存取。
52 13
|
9天前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
137 85