Java Spring mvc 操作 Redis 及 Redis 集群

近些年,随着《街头霸王》、《死或生》、《苍翼默示录》等很多街机格斗游戏纷纷登陆家用机、PC,甚至是掌机、手机平台,在笨重的街机平台奄奄一止的格斗游戏似乎还被了百花争艳的初时代。然而随着号称作续作、独立黑马的连天出现,琳琅满目的格斗游戏在被很多玩家大呼过瘾的以,也为有些怀古玩家开始回忆起那些以岁月经过里逐渐褪色的大手笔,首先想到的就算是《THE
KING OF FIGHTERS》——《拳皇》。

 本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5941953.html

作者:HUSH——游民星空热心读者

至于 Redis
集群搭建得参考我之另一样篇稿子 Redis集群搭建和简短用

流浪汉星空热心读者投稿,讲来好心之故事。

Redis 是啊,能举行呀

Redis
是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、以不变应万变聚集,位图,hyperloglogs当数据类型。内置复制、Lua脚本、LRU收回、事务同不同级别磁盘持久化功能,同时通过Redis
Sentinel 提供高可用,通过 Redis Cluster
提供自动分区。(摘自 Redis
官网)

(点击图片进入专栏列表)

作内存数据库,在现世互联网 web 系统受到,还是要以 Redis
作为缓存使用。大型互联网 Web
系统针对性能要求老高,而以前者和数据层之间加多少缓存已成为必要的手腕之一,当前于盛行的一定量独技术就是是 Redis
和 Memcached,至于两岸有啊界别,不是本文要说之情节。本文主要出口 Java
web 如何操作 Redis 及 Redis 集群。

于更了《拳皇97》、98底发达,99-01的孤寂甚至诬陷,再至《拳皇XIII》所带的初热潮,拳皇系列实在承载了打架玩家最多的关怀与希,而以拳皇系列正统续作近乎销声匿迹的今日,我们到底想要一如既往缓慢哪的《拳皇》,成为了好多玩家幻想与YY的话题。

相似 Java 程序操作Redis

增长的角色与招式

Redis 提供了多种语言的客户端,在 Java 中最为盛的凡
Jedis 。访问可查看源码及应用办法。目前
Jedis 最新版本是2.9.0。无论是单机还是集群,Jedis
都生格外详细的说明与实例代码,这里只有做简单说明。如果因此 Maven
做保险管理,需要引用  jedis 包,本例使用时的2.9.0本,如下:

拳皇系列之所以能够在初就广受好评,最要紧之素即是多重底角色跟招式,初代拳皇94底出场角色就多上24口,比由CAPCOM同期的《街霸ZERO》(1995年)多出了大体上上述。且不发话游戏系统与素质本身,参战人数上的优势切是拳皇系列的一律生特征。

<dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.9.0</version>
</dependency>  

操作 Redis 单机

多上24称作角色的豪华阵容(角色大多源自于SNK自己之玩,理论及《拳皇94》是“SNK大乱斗”)

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

/**
 * Created by fengdezitai on 2016/10/9.
 */
public class JedisClient {

    private static final String host= "192.168.31.121";

    private static final JedisClient jedisClient = new JedisClient();

    private Jedis jedis = null;
    /**
     * 私有构造函数
     */
    private JedisClient(){}

    public static JedisClient getInstance(){
        return jedisClient;
    }

    private JedisPoolConfig getPoolConfig(){
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(10);
        jedisPoolConfig.setMaxTotal(100);
        jedisPoolConfig.setMaxWaitMillis(3000);
        return jedisPoolConfig;
    }

    /**
     * 添加
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public Boolean add(String key,String value) throws Exception{
        JedisPool pool = new JedisPool(getPoolConfig(),host);
        Jedis jedis = null;
        try {
            jedis = pool.getResource();
            if(jedis.exists(key)){
                throw new Exception(String.format("key (%s) 已存在 ",key));
            }
            jedis.set(key,value);

        }catch (Exception e){
            throw e;
        }
        finally {
            if(jedis!=null){
                jedis.close();
            }
        }
        pool.destroy();
        return true;
    }

    /**
     * 获取值
     * @param key
     * @return
     * @throws Exception
     */
    public String get(String key) throws Exception{
        JedisPool pool = new JedisPool(getPoolConfig(),host);
        Jedis jedis = null;
        String result = "";
        try {
            jedis = pool.getResource();
            result = jedis.get(key);
        }catch (Exception e){
            throw e;
        }
        finally {
            if(jedis!=null){
                jedis.close();
            }
        }
        pool.destroy();
        return result;
    }

    public static void main(String[] args) {
        JedisClient jedisClient = JedisClient.getInstance();
        try {
            /*Boolean result = jedisClient.add("hello", "redis1");
            if(result){
                System.out.println("success");
            }*/

            System.out.println(jedisClient.get("hello"));
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

除外角色数量达到的“大手笔”,开发企业SNK在人物特色及吗下足了功夫。首先由人物特色及来讲,与《街霸》相比,《拳皇》的角色设定显得更为天马行空,作为系列主角,拳皇94-98之千古留级生草薙京,不但人物性格桀骜不驯,自信甚至毒舌,其招式动作吗直露酷炫:从平开始当简单的兵荒马乱升上系角色,到后来踏实的靠追加输入技(毒咬-罪咏-罚咏)等吸引的增加技能也中心的角色,草薙京的性质和实战方式就有了风雨飘摇的改变。因此,包括主角在内,每一样犯拳皇系列中之角色都或当造型、战斗作风及面世庞大的变动(罗伯特为是单最好之例子,这个角色当2000遇甚至成了一系列少有的全蓄力型角色)。

操作 redis 集群

import redis.clients.jedis.*;
import java.util.HashSet;
import java.util.Set;

/**
 * Created by fengdezitai on 2016/10/13.
 */
public class JedisClusterClient {

    private static int count = 0;

    private static final JedisClusterClient redisClusterClient = new JedisClusterClient();

    /**
     * 私有构造函数
     */
    private JedisClusterClient() {}

    public static JedisClusterClient getInstance() {
        return redisClusterClient;
    }

    private JedisPoolConfig getPoolConfig(){
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(1000);
        config.setMaxIdle(100);
        config.setTestOnBorrow(true);
        return config;
    }

    public void SaveRedisCluster() {
        Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
        jedisClusterNodes.add(new HostAndPort("192.168.31.245", 7000));
        jedisClusterNodes.add(new HostAndPort("192.168.31.245", 7001));
        jedisClusterNodes.add(new HostAndPort("192.168.31.245", 7002));
        jedisClusterNodes.add(new HostAndPort("192.168.31.210", 7003));
        jedisClusterNodes.add(new HostAndPort("192.168.31.210", 7004));
        jedisClusterNodes.add(new HostAndPort("192.168.31.210", 7005));

        JedisCluster jc = new JedisCluster(jedisClusterNodes,getPoolConfig());
        jc.set("cluster", "this is a redis cluster");
        String result = jc.get("cluster");
        System.out.println(result);
    }

    public static void main(String[] args) {
        JedisClusterClient jedisClusterClient = JedisClusterClient.getInstance();
        jedisClusterClient.SaveRedisCluster();
    }
}  

《拳皇》主角形象演化过程

Spring mvc 操作 Redis

一旦SNK也从未止新的探赜索隐以及发现,拳皇99随后引入的新支柱——白发黑衣的墨镜暴力男K’在当下益赢得了一对一的人气,尽管99-01底素质普遍未深受看好,但是新加入的角色还是为千家万户赚够了人气;再届03以后的新支柱ASH——白发红衣的雀斑美(niang)男(pao)更是为此该离经叛道的角色性格吸引了众多玩家的眼球。

在 Spring mvc 中操作 Redis ,首先当然如果加进好 Spring mvc
框架了。以下是于借设 Spring mvc 环境既架好之场面下。本例中 Spring
版本为 4.3.2 RELEASE。关于 Spring 的 maven 引用如下:

<!-- spring版本号 -->
<spring.version>4.3.2.RELEASE</spring.version>

<!-- spring核心包 -->
    <!-- springframe start -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
      <exclusions>
        <exclusion>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-oxm</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
      <exclusions>
        <exclusion>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>${spring.version}</version>
    </dependency>


    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- springframe end -->

《街霸》主角形象之演化过程

操作 Redis 单机

再就是,让咱来探视拳皇系列的镇对——《街霸》的顶梁柱,一直都是非常苦死仇深、一以正经之水陆男“隆”,这个角色在更了二十几年之变质之后,必杀技依然是不安、升龙、旋风脚等……变化的几只是特效。当然如此说绝不贬低任何角色,事实上街霸系列这种实干的严加设定正是漫山遍野人物的魅力所在,但是作为一个玩家来说,谁休情愿见到更加丰富多变的角色也?拳皇系列涵盖了最为多玩法各异甚至生有试验色彩的杀作风,我们当然也期SNK能够将这种风格及特点延续下去,在新的《拳皇》作品被,为咱带来更加奇怪的角色跟招式,同时,我们也酷期待能够当新平台被看到系列人气角色的回归和蜕变,比如呼声甚高的“大蛇八杰”(至少是“三杰”)。

不过所以 Jedis 自己实现注入(区别为下的援spring-data-redis) 

将前面的 JedisClient 代码用过来引用即可,只需要兑现一个走访 Redis 的
Service ,就可合到 Spring mvc 。Service 代码如下:

《拳皇2002》之后便已不见踪影的“大蛇三杰”(如果未算是上XIII中的背景的语)

import org.springframework.stereotype.Service;
import util.JedisClient;

/**
 * Created by fengdezitai on 2016/10/9.
 */
@Service
public class RedisService {

    public String get(String key) throws Exception{
        JedisClient jedisClient = JedisClient.getInstance(); //上面实现的JedisClient
        String result = "";
        try {
            result = jedisClient.get("hello");
        }catch (Exception e){
            throw e;
        }
        return result;
    }
}

易上手连值得研究的体系

Controller 实现如下:

权一舒缓格斗游戏的上下,游戏系统本来是一律码主要之指标。格斗游戏从早期简单的打击、防御、跳跃,发展到当下纷繁复杂的赶紧节奏攻防转换,精彩独到的案例太多,值得研究与探究的话题呢不丢掉,在这边,我们就用目光在《拳皇》系列本身。

@Controller
@RequestMapping(value = "redisAllInOne")
public class RedisAllInOneController {

    @Autowired
    private RedisService redisService;

    @RequestMapping(value = "get",method = RequestMethod.GET)
    @ResponseBody
    public Object getByMyService(String key){
        try {
            String result = redisService.get(key);
            return result;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}  

《拳皇》系列以功成名就引入了逃避、解投、多种纵方式等等基础要素的衍,众所周知的,最被人口津津乐道的特性就是是令人乱的“连续技”,而起“连续技”这等同话题开展起来,拳皇系列连续技的主导就是是“取消”。“取消”本身其实并非《拳皇》系列的专利,所谓“取消”是靠中断角色时动作要收招硬直,通过适时的命令输入强制引入下同样动作的体系,在格斗游戏普遍适应了“普通技——特殊技巧——必杀技”这种使用“取消”来实现连续技的架构下,拳皇系列其实早已开辟了全新的“连击技巧”。换而言之,拳皇系列将“取消”这个体系,至少说既在一段时间内,发挥到了无以复加,这虽是super
cancel——超级取消。

于是 spring-data-redis 包做并

面是和谐实现之流入,这里用 spring-data-redis
进行合并,只需要简布置即可,需要引用 maven 包如下,版本为当前风行版
1.7.2.RELEASE:

吃广大玩家奉为经典的《拳皇2002》,想当初笔者之计算机里啊满怀了几十摆设这种截图

<dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-redis</artifactId>
      <version>1.7.2.RELEASE</version>
    </dependency>

夫体系最早出现在《拳皇2001》,它好为超必杀技在一定必杀技动作受到取消使来,延伸了传统连续技模式的长短和套路,这确实被连续技变得尤为豪华而好掌握(相对“目押”来说,“取消”的输入判定要宽松不少),而以这作之后《拳皇2002》中引入的power
max则允许得玩家可于一段时间内反复使用“超级取消”,也巧因为马上无异于网的引入,让《拳皇2002》成为了多拳皇迷心目中之神作,再至《拳皇XIII》,这同一体系继续为发扬光大,成为了“Hyper
Drive
Mode”这个体系于角色会在定杀技中取消其他必杀技或超必杀技,并且多了好撤销超必杀技的NEO
MAX超必杀技。游戏系统仁者见仁智者见智,但是不可否认的是,正是以这种连技模式的出现,而被《拳皇XIII》成为系列中最华丽、观赏度最高的一作。

采取 spring-data-redis
,即省去了温馨实现注入的进程,通过它们提供的一些配备,即可实现连接池配置、RedisTemplate
配置、JedisConnectionFactory 配置;通过 JedisConnectionFactory
可配置连接池参数、redis
服务器、端口、密码、超时时间、database索引等;RedisTemplate 即注入的bean
,可以以 RedisTemplate 自动注入的实体进行 redis
的等同层层操作,具体看安排;

redis 服务属性配置文件:

通过“Hyper Drive”和“super cancel”“轻松”达成的赛伤连携

redis.maxIdle=300
redis.maxWait=3000
redis.testOnBorrow=true
redis.host=192.168.31.121
redis.port=6379
redis.password=password
redis.timeout=3000

不过笔者于这边只能指出的凡,《拳皇XIII》中过度使用的“取消”让玩家中的对抗,从一招一式的博弈变为了Combo(连击)技巧的胶着,某些角色通过“取消”能够运用有一定霸气之Combo,往往要找到敌方,就立刻会将对方带入连击地狱,这种对抗虽然可怜有观赏性,并且不乏高超技术,但是这也教新玩家入手的诀窍变得相当之高,如果未克熟练掌握几模仿“超级取消”的连击技巧,是大不便在高手如林的网络对战中崭露头角,最后为只能沦为到永打电脑的“单机玩家”,比如笔者自我……

spring-data-redis xml 配置文件 redis-context.xml:

实质上,在此之前,《拳皇98》已经做出过一个对立成功之先河——双网,同时兼职了老玩家以及尝鲜者。为了名目繁多发展考虑,也以那些“不是大师”的打斗玩家也会赢得乐趣,我们要想看同样舒缓在保存系列花的又,入手难度又无是“那么大”的《拳皇》作品,让我们能够以玩耍受逐步成长,或者至少是在菜鸟和高手之间,创造一个针锋相对宽松的“缓冲区”。

<!-- jedis 连接池 配置 -->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" >
        <property name="maxIdle" value="${redis.maxIdle}" />
        <property name="maxWaitMillis" value="${redis.maxWait}" />
        <property name="testOnBorrow" value="${redis.testOnBorrow}" />
    </bean>
    <!-- redis服务器中心 -->
    <bean id="connectionFactory"  class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >
        <property name="poolConfig" ref="poolConfig" />
        <property name="port" value="${redis.port}" />
        <property name="hostName" value="${redis.host}" />
        <!--<property name="password" value="${redis.password}" />-->
        <property name="timeout" value="${redis.timeout}" ></property>
        <property name="database" value="1"></property>
    </bean>

    <bean id="commonRedisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="keySerializer" ref="stringRedisSerializer" />
        <property name="hashKeySerializer" ref="stringRedisSerializer" />
        <property name="valueSerializer" ref="stringRedisSerializer" />
        <property name="hashValueSerializer" ref="stringRedisSerializer" />
    </bean>

    <bean id="connectionFactory1"  class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >
        <property name="poolConfig" ref="poolConfig" />
        <property name="port" value="${redis.port}" />
        <property name="hostName" value="${redis.host}" />
        <!--<property name="password" value="${redis.password}" />-->
        <property name="timeout" value="${redis.timeout}" ></property>
        <property name="database" value="2"></property>
    </bean>

    <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />
    <bean id="cacheRedisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >
        <property name="connectionFactory" ref="connectionFactory1" />
        <property name="keySerializer" ref="stringRedisSerializer" />
        <property name="hashKeySerializer" ref="stringRedisSerializer" />
        <property name="valueSerializer" ref="stringRedisSerializer" />
        <property name="hashValueSerializer" ref="stringRedisSerializer" />
    </bean>

民俗而精的2D绘制

后来以 spring 配置文件中引用以上文件:

由来,各类游戏的镜头呈现于打街机盛行之一时已不知上升了多少只水平,然而实际上,尽管有着《撕裂重罪》、《街霸EX》等,在马上来讲素质不俗的3D建模格斗游戏,直到《街霸4》出现前,2D制图的格斗游戏还是直接维系着一定高涨的人气,而《拳皇XIII》、《苍翼默示录》、《夜下生》等游艺之面世也依旧给咱们针对精密的2D作图要罢不克。

<import resource="redis-context.xml" />  

解释一下上面的布置:

任由是坐立要今天之意见来拘禁《KOF: MaXIIImum
Impact》的变现效果都遗憾

poolConfig 即配置 redis 连接池,之后安排了点儿独 JedisConnectionFactory 和
RedisTemplate ,一个 RedisTemplate 对应一个 JedisConnectionFactory
,这样可安排根据气象布局不同的 Redis
连接,比如超时时间要求无雷同、database 0-15
可以储存不同的数目等。这里就是配置了database 1 与 2
,调用 commonRedisTemplate 会满怀到 database1 ,调用 cacheRedisTemplate
会满怀到 database2。

用作《拳皇》系列来讲,笔者认为最符合该系列之绘图方式,依然是人情的2D镜头,我们早已表现了了SNK在3D建模方面的实力,不管是《KOF:
MaXIIImum
Impact》还是《侍魂闪》都于丁不敢恭维,反倒是《拳皇XIII》所呈现有之通、动感十足的手绘2D人与气象在当时能够再次引发一湾拳皇热潮,召回同一批判忠实粉丝的还要并会于这画面展现相当成熟的《街霸4》手下尽早得一席之地,甚至好有当年CAPCOM和SNK两独镇对手在集机厅里分庭抗礼的气氛。

从此于 Service 层即可注入并引述这片只 RedisTemplate ,如下代码:

import org.apache.commons.lang3.StringUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.io.*;

@Repository
public class RedisCache {
  
    @Resource(name = "cacheRedisTemplate")
    private RedisTemplate<String, String> cacheRedisTemplate;

    public void put(Object key, Object value) {
        if(null == value) {
            return;
        }

        if(value instanceof String) {
            if(StringUtils.isEmpty(value.toString())) {
                return;
            }
        }

        // TODO Auto-generated method stub
        final String keyf = key + "";
        final Object valuef = value;
        final long liveTime = 86400;

        cacheRedisTemplate.execute(new RedisCallback<Long>() {
            public Long doInRedis(RedisConnection connection)
                    throws DataAccessException {
                byte[] keyb = keyf.getBytes();
                byte[] valueb = toByteArray(valuef);
                connection.set(keyb, valueb);
                if (liveTime > 0) {
                    connection.expire(keyb, liveTime);
                }
                return 1L;
            }
        });
    }

    public Object get(Object key) {
        final String keyf = (String) key;
        Object object;
        object = cacheRedisTemplate.execute(new RedisCallback<Object>() {
            public Object doInRedis(RedisConnection connection)
                    throws DataAccessException {

                byte[] key = keyf.getBytes();
                byte[] value = connection.get(key);
                if (value == null) {
                    return null;
                }
                return toObject(value);

            }
        });

        return object;
    }

    /**
     * 描述 : <byte[]转Object>. <br>
     * <p>
     * <使用方法说明>
     * </p>
     *
     * @param bytes
     * @return
     */
    private Object toObject(byte[] bytes) {
        Object obj = null;
        try {
            ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
            ObjectInputStream ois = new ObjectInputStream(bis);
            obj = ois.readObject();
            ois.close();
            bis.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        return obj;
    }

    private byte[] toByteArray(Object obj) {
        byte[] bytes = null;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(obj);
            oos.flush();
            bytes = bos.toByteArray();
            oos.close();
            bos.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return bytes;
    }
}

《拳皇XII》的绘图其实早已让丁相当满意

末尾在 Controller 中调用即可

2D作图己工程浩大,即便是《苍翼默示录》这种新晋游戏也不免会在锯齿和混淆的观,然而不得不说,就到底像《月姬格斗》这种角色点阵明显的格斗游戏也会因流畅的动作与值得研究的网获得玩家的拥护,笔者还是认为,对于格斗游戏来说,2D绘制是意可以让玩家奉,并且对《拳皇》系列来讲,也完全是制作商所擅长的品种。

    @Autowired
    private RedisCache redisCache;


    @RequestMapping(value = "get", method = RequestMethod.GET)
    @ResponseBody
    public Object getByMyService(String key) {
        try {
            String result = redisService.get(key);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @RequestMapping(value = "save", method = RequestMethod.GET)
    @ResponseBody
    public Object save() {
        Token token = new Token();
        token.setAccess_token("token");
        token.setExpires_in(1000);
        try {
            redisCache.put("token", token);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "ok";
    }  

操作 Redis 集群

具有不错2D作画水平的《苍翼默示录》

就所以 Jedis 自己澳门美高梅手机网站实现注入(区别为下的援spring-data-redis)

拿前的 JedisClusterClient 代码用过来引用即可,只需要兑现一个拜 Redis
的 Service ,就足以合到 Spring mvc 。Service 代码如下:

镜头及无须死典型的《月姬格斗》

import org.springframework.stereotype.Service;
import util.JedisClusterClient;

/**
 * Created by fengdezitai on 2016/10/13.
 */
@Service
public class RedisClusterService {

    public void save() throws Exception{
        //调用 JedisClusterClient 中的方法
        JedisClusterClient jedisClusterClient = JedisClusterClient.getInstance();
        try {
            jedisClusterClient.SaveRedisCluster();
        }catch (Exception e){
            throw e;
        }
    }
}

感人的故事剧情

末段以 Controller 中调用实现的 Service 即可

恐怕对于一款格斗游戏来说,故事剧情在里边的重并不需要很可怜,但是当格斗游戏从喧闹的街机平台来了PC或者家用机领域,玩家在纯的对战之衍也相当愿意静下心来去询问一款游戏的文化背景,丰富的世界观设定与故事编撰也愈加成为了玩家讨论的话题。

@Controller
@RequestMapping(value = "redisCluster")
public class RedisClusterController {

    @Autowired
    private RedisClusterService redisClusterService;

    @RequestMapping(value = "save",method = RequestMethod.GET)
    @ResponseBody
    public Object save(){
        try{
            redisClusterService.save();
        }catch (Exception e){
            e.printStackTrace();
            return String.format("error: %s",e.getMessage());
        }
        return "ok";
    }
}  

作之点的打响案例,笔者初想到的就是是《苍翼默示录》系列,这款由Arc
System
Works开发之格斗游戏从平开始就是以付出要放在了大半平台,在街机平台推出后连忙,家用机,掌机,PC平台的续作和加强版本虽接踵而来,最受玩家津津乐道的地方,就是该系列特大、完备的人生观和生有深的剧情安排。

从而 spring-data-redis 包做并 

设饮誉的《苍翼》系列,恰恰继承了拖欠店铺《罪恶装备》系列之优良传统。除了用格斗游戏的底蕴体系完美之外,还进入了大气之剧情内容,也尽管是故事模式。故事模式遭遇,通过大气之对话,专业的CV演出,不时穿插的剧情动画,使得人背景、剧情走向在各个一样管辖著作被得前仆后继及加重,让玩家针对一切《苍翼》世界有矣一个到的之垂询和认识。“让玩家带来在感情去行使角色”“让玩家真正体验及扮他所用的角色”,这种规划意见给小非格斗玩家甚至是手残患者也义无反顾地成为了粉丝,不得不说,这种设计模式是打响而值得推广的。

Spring 和 spring-data-redis maven
包引述和前面一致,之所以引用 spring-data-redis 1.7.2.RELEASE,是因脚下只有这新型版本才支撑集群操作。

redis 集群服务特性配置

于戏称为“格斗AVG”的《苍翼默示录》,对话选择、图鉴收藏等AVG要素一应俱全

redis.maxIdle=300
redis.maxWait=3000
redis.testOnBorrow=false
redis.timeout=3000

足乐观的凡,《拳皇》系列其实全不乏故事演绎的情跟挖掘潜力。在此地,笔者不得不带带及有个体情感色彩,我所点的率先统卡通不是《龙珠》,不是《灌篮高手》,而是由于香港漫画家许景探绘制的《拳皇99》,正是以接触了部启蒙的作,在尺度有限的情景下,我要于网上大致了解了拳皇的故事背景,也以一定长之一段时间内沉迷其中。

spring-data-redis xml 集群配置文件 redis-cluster-context.xml

<!-- 连接池 配置 -->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" >
        <property name="maxIdle" value="${redis.maxIdle}" />
        <property name="maxWaitMillis" value="${redis.maxWait}" />
        <property name="testOnBorrow" value="${redis.testOnBorrow}" />
    </bean>


    <bean id="redisClusterConfig" class="org.springframework.data.redis.connection.RedisClusterConfiguration">
        <property name="maxRedirects" value="3"></property>
        <property name="clusterNodes">
            <set>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="192.168.31.245"></constructor-arg>
                    <constructor-arg name="port" value="7000"></constructor-arg>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="192.168.31.245"></constructor-arg>
                    <constructor-arg name="port" value="7001"></constructor-arg>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="192.168.31.245"></constructor-arg>
                    <constructor-arg name="port" value="7002"></constructor-arg>
                </bean>
                 <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="192.168.31.210"></constructor-arg>
                    <constructor-arg name="port" value="7003"></constructor-arg>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="192.168.31.210"></constructor-arg>
                    <constructor-arg name="port" value="7004"></constructor-arg>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="192.168.31.210"></constructor-arg>
                    <constructor-arg name="port" value="7005"></constructor-arg>
                </bean>
            </set>
        </property>
    </bean>

    <bean id="redis4CacheConnectionFactory"
          class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <constructor-arg name="clusterConfig" ref="redisClusterConfig" />
        <property name="timeout" value="${redis.timeout}" />
        <property name="poolConfig" ref="poolConfig"/>
    </bean>


    <bean name="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />
    <bean id="clusterRedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="redis4CacheConnectionFactory" />
        <property name="keySerializer" ref="stringRedisSerializer" />
        <property name="hashKeySerializer" ref="stringRedisSerializer" />
        <property name="valueSerializer" ref="stringRedisSerializer" />
        <property name="hashValueSerializer" ref="stringRedisSerializer" />
    </bean>

港漫味儿十足的《拳皇》漫画,其实画风还是相当出色之

之后于 Spring 配置文件被援

拳皇的世界观很有风味,在《拳皇99》之前,因为系列的要反面人物还是“大蛇一族”,围绕着草薙、神乐和八神家族的恩恩怨怨情仇为任何娱乐营造了同一种植“现代都神话”的空气,而99到01所提供的宇宙观又是有关高科技组织NETS的丑恶阴谋,相关剧情更是关乎了“克隆人”、“改造人”等充分享时代感的概念,这种幽默之差异和融合为叫拳皇世界变得进一步多元化。事实上,如果SNK可以认认真真地挖掘剧情设定里之底细,拳皇系列完全好望玩家展现一个巨大而且引人入胜的好故事。

<import resource="redis-cluster-context.xml" />

咱得以看到SNK的不竭尝试,从《拳皇03》开始,到《拳皇XIII》结束的“遥远彼之地”讲述了一个完全而有趣之故事,XIII的结局则稍有烂尾的疑心,但是毕竟是为“牺牲主角的身”为代价大玩“祖父悖论”,作为历史及第一独在剧情里那个掉的格斗游戏主角,ASH为了振兴拳皇系列也是不行拼的。于是,在收看《拳皇XIII》“惊人之究竟”之后,玩家当更期待SNK能以全新的主题篇章里吗玩家带来怎样的主线剧情,而于初系列里,由于ASH已充分,有事烧……啊不是,在ASH篇结束以后,究竟是由草薙重新挑起主角大梁还是引入更加离经叛道的初角色,都拿凡SNK为普遍玩家所能够拉动的无比要命惊喜。

说以上配置

poolConfig是连接池配置,redisClusterConfig 配置了 Redis
集群的逐条节点(节点 host 和 port 最好写在性质配置文件中),集群搭建可见
我之 外一样首博客 。然后下与单机配置一样了,一针对
JedisConnectionFactory 和 RedisTemplate 。

下在 Service 层即可注入并引用这 RedisTemplate,代码如下:

拳皇系列开发之新作,已经判定是3D化,为啥我看在这张脸就从不了调侃它的欲望也……(事实上这款新作的制作人员还当招生中,成品和图片无关)

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;

import java.io.*;

/**
 * Created by fengdezitai on 2016/9/29.
 */
@Repository
public class RedisClusterCache {

    @Autowired
    private RedisTemplate clusterRedisTemplate;


    public void put(Object key, Object value) {
        if(null == value) {
            return;
        }

        if(value instanceof String) {
            if(StringUtils.isEmpty(value.toString())) {
                return;
            }
        }

        // TODO Auto-generated method stub
        final String keyf = key + "";
        final Object valuef = value;
        final long liveTime = 86400;

        clusterRedisTemplate.execute(new RedisCallback<Long>() {
            public Long doInRedis(RedisConnection connection)
                    throws DataAccessException {
                byte[] keyb = keyf.getBytes();
                byte[] valueb = toByteArray(valuef);
                connection.set(keyb, valueb);
                if (liveTime > 0) {
                    connection.expire(keyb, liveTime);
                }
                return 1L;
            }
        });
    }

    public Object get(Object key) {
        final String keyf = (String) key;
        Object object;
        object = clusterRedisTemplate.execute(new RedisCallback<Object>() {
            public Object doInRedis(RedisConnection connection)
                    throws DataAccessException {

                byte[] key = keyf.getBytes();
                byte[] value = connection.get(key);
                if (value == null) {
                    return null;
                }
                return toObject(value);

            }
        });

        return object;
    }

    /**
     * 描述 : <byte[]转Object>. <br>
     * <p>
     * <使用方法说明>
     * </p>
     *
     * @param bytes
     * @return
     */
    private Object toObject(byte[] bytes) {
        Object obj = null;
        try {
            ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
            ObjectInputStream ois = new ObjectInputStream(bis);
            obj = ois.readObject();
            ois.close();
            bis.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        return obj;
    }

    private byte[] toByteArray(Object obj) {
        byte[] bytes = null;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(obj);
            oos.flush();
            bytes = bos.toByteArray();
            oos.close();
            bos.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return bytes;
    }
}

末段之期许

末尾当 Controller 中调用即可

最近几年来,关于拳皇的另新闻都能挑逗起一百般批判格斗玩家的关爱,然而当下款名牌名作的现状却使得人愈来愈失望,续作的开销遥遥无期,手游、网游平台各种圈钱跟冷饭行为也受多元玩家流失严重,看正在就的一直对手《街霸》系列一个连贯一个地生产新本子,新本子做了事后很快放出正统续作,SNK似乎已经陷入了“破罐子破摔”的无所作为境地,作为同样称呼对拳皇系列非常有心思的老玩家,只能相信SNK圈够了钱,最终还是能为玩家呈现出一致管不枉期待的正规化续作。我们连无指望SNK能够东山再起往日之勃勃光景,不愿意《拳皇》能够更归来历史舞台继续同《街霸》一较高下,我们只是梦想这样一统从小陪伴在我们,承载着无限多青葱记忆之一日游能迈着我们熟悉的步履给拥有玩家一份似乎已相识的感动。

@Controller
@RequestMapping(value = "redisCluster")
public class RedisClusterController {

    @Autowired
    private RedisClusterCache redisClusterCache;

    @RequestMapping(value = "clusterSave",method = {RequestMethod.GET,RequestMethod.POST})
    @ResponseBody
    public Object clusterSave(){
        //redisClusterCache.put("cluster","save cluster");
        Token token = new Token();
        token.setExpires_in(1000);
        token.setAccess_token("hello world");
        redisClusterCache.put("token",token);
        return "ok";
    }

    @RequestMapping(value = "getKey",method = RequestMethod.GET)
    @ResponseBody
    public Object getCluster(String key){
        Object val = redisClusterCache.get(key);
        return val;
    }
} 

注意事项:

  • 本问题,如果就此 spring-data-redis 做并操作 Reids
    集群,只有 spring-data-redis
    目前风行版本1.7才含有对集群的操作,而行的 spring-data-redis
    中之一点功能对 Spring mvc
    的本子为生几限制,所以尽量选大版本的 Spring mvc 对应。
  • 假设存储的value值是一个实体对象,那么早晚要是促成 Serializable 接口

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注