`
buliedian
  • 浏览: 1237817 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Servlet 3.0笔记之Redis操作示范Retwis JAVA版

阅读更多

最近学习Redis ,一个目前风头正劲的KEY-VALUE NOSQL,支持LIST、SET、MAP等格式存储,某些操作竟然是原子级别,比如incr命令,相当惊艳。官方提供的一个Retwis (simple clone of Twitter)示范,证明了完全可以使用redis替代SQL数据库存储数据,真是一大开创性创新,挑战人们的传统思维模式,为之惊叹!

不过那是一个PHP版本,我下载到本地PHP但无法部署成功;还好有一个Retwis-RB 示范,还提供一个在线版,试用之后,再下载源代码,RUBY + Sinatra MVC结构,看的流口水,代码那般简洁。

为体验Redis,同时也为对比Ruby代码,因此诞生了Retwis-JAVA,Retwis-RB的山寨版,因此其逻辑和HTML资源一致,再次表示对原作者Dan Lucraft 的感谢。

Retwis-JAVA,基于Servlet 3.0 + UrlRewrite + Freemarker + Jedis。示范运行在Tomcat 7中,redis为最新的2.22版本,jedis为redis的java客户端操作框架。在Servlet 3.0规范中,对Url映射处理依然没有进步,因此只能使用UrlRewrite框架让部分url看起来友好一些。另外,项目没有使用IOC容器框架,没 有使用MVC框架,代码量稍微多些,代码相对耦合一些。若使用Struts2 + Spring 代码量会少一些。

对涉及到的redis存储结构,大致如下:


涉及到的两个对象很简单:


序列化后以二进制数据保存到redis中:

     private   byte [] object2Bytes(V value) {
        
if  (value  ==   null )
            
return   null ;

        ByteArrayOutputStream arrayOutputStream 
=   new  ByteArrayOutputStream();
        ObjectOutputStream outputStream;
        
try  {
            outputStream 
=   new  ObjectOutputStream(arrayOutputStream);

            outputStream.writeObject(value);
        } 
catch  (IOException e) {
            e.printStackTrace();
        } 
finally  {
            
try  {
                arrayOutputStream.close();
            } 
catch  (IOException e) {
                e.printStackTrace();
            }
        }

        
return  arrayOutputStream.toByteArray();
    }


    
public   void  save(String key, V value) {
        jedis.set(getKey(key), object2Bytes(value));
    }

获取用户的timeline时,redis的LRANGE命令提供对list类型数据提供分页操作:

     private  List < Status >  timeline(String targetId,  int  page) {
        
if  (page  <   1 )
            page 
=   1 ;

        
int  startIndex  =  (page  -   1 *   10 ;
        
int  endIndex  =  page  *   10 ;

        List
< String >  idList  =   super .jedis
                .lrange(targetId, startIndex, endIndex);

        
if  (idList.isEmpty())
            
return   new  ArrayList < Status > ( 0 );

        List
< Status >  statusList  =   new  ArrayList < Status > (idList.size());
        
for  (String id : idList) {
            Status status 
=  load(Long.valueOf(id));

            
if  (status  ==   null )
                
continue ;

            status.setUser(userService.load(status.getUid()));

            statusList.add(status);
        }

        
return  statusList;
    }

很显然,LRANGE取出了Status对象的ID,然后我们需要再次根据ID获取对应的Status对象二进制数据,然后反序列化:

     public  Status load( long  id) {
        
return   super .get(getFormatId(id));
    }

    
private  String getFormatId( long  id) {
        
return  String.format(STATUS_ID_FORMAT, id);
    }

    
private   static   final  String STATUS_ID_FORMAT  =   " status:id:%d " ;

    
public  V get(String key) {
        
return  byte2Object(jedis.get(getKey(key)));
    }

    @SuppressWarnings(
" unchecked " )
    
private  V byte2Object( byte [] bytes) {
        
if  (bytes  ==   null   ||  bytes.length  ==   0 )
            
return   null ;

        
try  {
            ObjectInputStream inputStream;
            inputStream 
=   new  ObjectInputStream( new  ByteArrayInputStream(bytes));
            Object obj 
=  inputStream.readObject();

            
return  (V) obj;
        } 
catch  (IOException e) {
            e.printStackTrace();
        } 
catch  (ClassNotFoundException e) {
            e.printStackTrace();
        }

        
return   null ;
    }

以上使用JDK内置的序列化支持;更多序列化,可参考hessian、google protobuf等序列化框架,后者提供业界更为成熟的跨平台、更为高效的序列化方案。更多代码请参见附件。

一些总结和思考:

  1. 不仅仅是缓存,替代SQL数据库已完全成为可能,更高效,更经济;虽然只是打开了一扇小的窗户,但说不准以后人们会把大门打开。
  2. 实际环境中,可能最佳方式为SQL + NOSQL配合使用,互相弥补不足;还好,redis指令不算多,可速查,简单易记。
  3. JAVA和RUBY代码相比,有些重

另:

在线版,请参考 http://retwisrb.danlucraft.com/。那个谁谁,要运行范例,保证redis运行才行。

Retwis-JAVA下载

2
2
分享到:
评论

相关推荐

    redis3.0安装包 window 64位

    Redis 3.0在原有的基础上进行了升级,新增了丰富的功能,其中包括支持Lua脚本、可插拔模块化、多主复制、集群等,使得Redis 3.0在性能、可扩展性、安全性等方面有着显著的提升。 2、Redis 3.0新特性: (1)支持Lua...

    windows2003 32位3.0版本的redis

    Redis 3.0版引入了一些关键功能和改进: 1. **集合操作优化**:Redis 3.0版本增强了集合(Sets)的操作性能,包括SINTER、SUNION和SDIFF等命令,使其在处理大量数据时更加高效。 2. **有序集合跳跃表实现**:在3.0...

    redis最新3.0版本

    6. **Bits per value (Bitmaps)**: Redis 3.0增强了Bitmaps功能,可以高效地处理位级别的操作,如设置、清除或检查特定位,这对于跟踪用户活动、状态标记等场景非常有用。 7. **地理空间索引`: Redis 3.0添加了`GEO...

    redis windows安装包 3.0.503

    Redis是一款开源、高性能的键值对存储...总的来说,安装Redis 3.0.503在Windows上需要配置服务、理解配置文件,并熟悉基本的命令操作。随着你对Redis的深入理解和实践,将能够利用其强大的功能来优化你的应用程序。

    redis-shake 3.0.0最新版

    **Redis-Shake 3.0.0:阿里云Redis数据同步工具详解** Redis-Shake是阿里云Redis&MongoDB团队开发的一款开源工具,专门用于在不同的Redis实例之间进行数据迁移和同步。它提供了高效且灵活的数据迁移解决方案,帮助...

    Spring3.0整合redis相关jar

    "Spring3.0整合redis相关jar"这个主题主要涉及的是如何在Spring 3.0版本中集成Redis作为数据存储或缓存解决方案。Spring 3.0虽然相对较老,但在当时是广泛使用的版本,因此了解其与Redis的集成方式对维护旧项目或...

    redis3.0 windows 版

    在Windows环境下安装和使用Redis 3.0版本,可以帮助开发者在本地进行开发和测试,无需在Linux环境下操作。下面将详细介绍Redis 3.0在Windows系统中的安装、配置、使用及一些基本概念。 1. **Redis简介** - Redis是...

    redis 3.0 win7 32位x86

    在Windows环境下,特别是32位操作系统上安装和使用Redis可能需要额外的注意事项。以下是对Redis 3.0在Win7 32位x86系统上的一些关键知识点的详细说明: **1. Redis版本3.0** Redis 3.0是Redis的一个重要版本,发布...

    redis3.0.501绿色版

    3.0.501是Redis的一个版本,而“绿色版”通常指的是免安装版本,可以直接运行,不需要进行系统级别的安装,方便在不同的环境中快速部署和使用。 在Redis 3.0.501绿色版中,我们可以通过提供的批处理文件来管理Redis...

    redis-win64-3.0.503.rar

    `redis-win64-3.0.503.rar`这个压缩包包含了在Windows上安装Redis所需的基本文件,版本为3.0.503。 Redis 3.0.503是Redis的一个稳定版本,它提供了许多核心特性,如字符串、哈希表、集合、有序集合等数据类型,以及...

    Redis-x64-3.0.504安装包

    Redis-x64-3.0.504安装包是一个针对64位操作系统的Redis数据库服务器的安装程序。Redis是一款高性能、开源、基于键值对的数据存储系统,广泛应用于缓存、数据库、消息中间件等多个场景。这个版本是3.0.504,代表着在...

    redis3.0 demo

    在这个“redis3.0 demo”中,我们可以期待看到如何利用这些新特性来构建实际的应用场景。下面,我们将详细探讨Redis 3.0的关键知识点。 1. **Cluster模式**: - 文件名`redis.cluster`暗示了我们可能在研究Redis的...

    Redis3.0.500 for Windows最新版

    Redis 3.0.500是针对Windows平台的一个版本,相较于其他操作系统(如Linux),它为Windows用户提供了方便的本地环境。由于在GitHub上下载可能遇到困难,这个压缩包提供了最新版的Redis for Windows。 压缩包内的...

    Redis-x64-3.0.504.zip

    Redis-x64-3.0.504.zip 是 Redis 的 32 位版本,适用于 Windows 操作系统。这个压缩包包含了 Redis 3.0.504 版本的安装文件和辅助脚本,方便用户快速部署和管理 Redis 服务。 1. **Redis 简介**: Redis 是一种...

    redis-3.0.504 for windows

    本文将详细介绍如何在Windows上安装和使用Redis 3.0.504版本,以及其主要功能和使用技巧。 一、Redis 3.0.504 for Windows 安装 1. 下载:首先,你需要从官方或者可靠的第三方源下载Redis 3.0.504 for Windows的...

    redis安装教程和java操作服务器端demo

    以上就是Redis的安装教程以及Java操作Redis的基本步骤。在实际应用中,可以利用Redis的更多功能,如哈希表、集合、有序集合等,以及事务、发布订阅等高级特性,提升应用程序的性能和可扩展性。在开发过程中,确保对...

    Redis 3.0 window版

    redis3.0windows版,解压后可直接使用

    java redis 各类型操作实例

    本文将深入探讨如何使用Java与Redis进行各种类型的操作,并基于Maven项目管理来构建我们的示例代码。 首先,为了在Java项目中使用Redis,我们需要引入Jedis库,这是一个流行的Java Redis客户端。在Maven项目的`pom....

    基于netcore 3.0的redis发布订阅示例代码

    在.NET Core 3.0中,我们可以使用StackExchange.Redis库来操作Redis,包括实现发布/订阅功能。 首先,我们需要安装StackExchange.Redis NuGet包,这是.NET社区维护的官方Redis客户端。在Visual Studio中,可以通过...

Global site tag (gtag.js) - Google Analytics