图片 8

Redis可视化工具Web,redis源代码结构解析

一、简介

  近来因为做事索要,使用了一些单机版Redis的分界面化管理工具,使用进程中那伤心的经历真正唯有用过的人本事体会;为此小编和同伴希图入手二个Redis可视化学工业具,可是因为小友人方今做事比较忙,搞了一大半没有时间继续(会有世袭,分界面不敢说,使用体验方面断定要比现存的好卡塔 尔(英语:State of Qatar);本人对wpf不是很熟,再想到十分久在此之前的web迅雷,就想开头完成三个web版的Redis的分界面化管理工具;如今这一个工具已伊始成型,所以放出去分享一下。

Java Spring mvc 操作 Redis 及 Redis 集群,mvcredis

 本文原创,转发请评释:

关于 Redis 集群搭建能够参照笔者的另后生可畏篇作品 Redis集群搭建与简便利用

Redis 是何许,能做什么样

Redis
是三个开源(BSD许可卡塔 尔(英语:State of Qatar),内部存款和储蓄器存款和储蓄的数据结构服务器,可用作数据库,高速缓存和音讯队列代理。它扶持字符串、哈希表、列表、会集、有序聚集,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以至不相同品级磁盘悠久化效率,同期经过Redis
Sentinel 提供高可用,通过 Redis Cluster 提供自动分区。(摘自 Redis 官方网址)

作为内部存款和储蓄器数据库,在现世网络 web 系统中,依旧最首要将 Redis
作为缓存使用。大型互连网 Web
系统对品质必要相当高,而在前面七个和数据层之间增添数据缓存已成为不可缺少的花招之生龙活虎,当前比较盛行的五个技术就是 Redis
和 Memcached,至于双方有怎么着界别,不是本文要说的内容。本文首要讲 Java
web 怎么着操作 Redis 及 Redis 集群。

平日 Java 程序操作Redis

Redis 提供了三种语言的顾客端,在 Java 中最风靡的是
Jedis 。访谈可查看源码及运用方法。如今 Jedis
最新版本是2.9.0。无论是单机依然集群,Jedis
都有很详细的认证和实例代码,这里只做轻巧表明。假如用 Maven
做包管理,要求引用  jedis 包,本例使用新型的2.9.0版本,如下:

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

操作 Redis 单机

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();
        }
    }
}

操作 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

在 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 单机

只用 Jedis 本身达成注入(区别于上边包车型地铁援引spring-data-redis卡塔尔 

把前边的 JedisClient 代码拿过来引用就可以,只需兑现叁个拜见 Redis 的
Service ,就足以合二为意气风发到 Spring mvc 。瑟维斯 代码如下:

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;
    }
}  

用 spring-data-redis 包做集成

地点是团结达成的流入,这里用 spring-data-redis
举行合併,只需轻松布署就可以,要求引用 maven 包如下,版本为前段时间新型版
1.7.2.RELEASE:

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

行使 spring-data-redis
,即省去了投机实现注入的长河,通过它提供的一些配置,就能够兑现连接池配置、RedisTemplate
配置、JedisConnectionFactory 配置;通过 JedisConnectionFactory
可安插连接池参数、redis
服务器、端口、密码、超时时间、database索引等;RedisTemplate 即注入的bean
,能够利用 RedisTemplate 自动注入的实业实行 redis
的意气风发多元操作,具体看安插;

redis 服务性质配置文件:

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

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

<!-- 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>

从今现在在 spring 配置文件中引用以上文件:

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

解释一下上边的布局:

poolConfig 即配置 redis 连接池,之后铺排了八个 JedisConnectionFactory 和
RedisTemplate ,二个 RedisTemplate 对应一个 JedisConnectionFactory
,那样能够安插依据气象布局不相同的 Redis
连接,举例超时时间必要不均等、database 0-15
能够积存差异的多少等。这里就安顿了database 1 和 2
,调用 commonRedisTemplate 会存到 database1 ,调用 cacheRedisTemplate
会存到 database2。

之后在 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;
    }
}

末段在 Controller 中调用就能够

    @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 集群

只用 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 就可以

@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";
    }
}  

用 spring-data-redis 包做集成 

Spring 和 spring-data-redis maven
包引述和前面意气风发致,之所以引用 spring-data-redis 1.7.2.RELEASE,是因为眼前唯有那一个最新版本才支撑集群操作。

redis 集群服务属性配置

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

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 配置文件中引用

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

表明以上配置

poolConfig是连接池配置,redisClusterConfig 配置了 Redis
集群的风度翩翩风流浪漫节点(节点 host 和 port 最棒写在性质配置文件中卡塔 尔(英语:State of Qatar),集群搭建可知作者的 另风姿浪漫篇博客 。然后下边和单机配置同样了,风流倜傥对 JedisConnectionFactory
和 RedisTemplate 。

而后在 Service 层就能够注入并引用这么些 RedisTemplate,代码如下:

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 中调用就能够

@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值是八个实体对象,那么确定要兑现 塞里alizable 接口

 

Spring mvc 操作 Redis 及 Redis
集群,mvcredis
本文原创,转发请注解:
关于 Redis 集群搭建能够参照笔者的另…

看了黄建宏先生的《Redis设计与落到实处》,对redis的有的完毕成了多少个分明的认知;

二、基本使用手续

  首先下载包,并解压张开,如下图:

  图片 1

  接下去双击文件WebRedisManager.exe运转,要是不可能运维以来,或者需求安装.net
framework 4.5,成功伸开界面如下:

  图片 2

  然后打开浏览器,地址栏按上边提醒输入url,分界面如下:

  图片 3

  当时就可以增多redis服务器了:

  图片 4

  增加功成业就后会自动显示在左臂:

  图片 5

  图片 6

  图片 7

  一些健康的增加和删除改查的魔法都有,近些日子还应该有部分查询功用、集群管理等还没水到渠成,今后查询项私下认可都以五十多个,后续再稳步加上吧。  

从前边试的时候被问到了那有的的从头到尾的经过,未有青眼,辛亏还会有岁月,就把Redis的源码看了一回。

三、开采简要介绍

  上边根本是基于SAEA.Socket通讯框架中的SAEA.RedisSocket、SAEA.WebApi多少个零件来落实redis通讯、webserver以致仿asp.net
mvc的便捷风格的后端程序,web端使用的是layui+ajax。项目源码结构:

  图片 8

 

Redis源码的拿走

Redis是全然开源的,其源代码能够在直接在GitHub上赢得:(这段时间的版本是4.4.0卡塔 尔(英语:State of Qatar)。那个时候,走入解压后的redis目录下的src文件夹,redis的全数源代码都存放在那。

四、大旨技能详细

  1.SAEA.RedisSocket:这些是基于SAEA.Socket完成的Redis编解码命令的客商端,如今打包了多边的redis数据操作命令和任何的redis
cluster命令,更加多详细可参照。

  2.SAEA.WebApi:那个是依据SAEA.Socket完毕的http编解码命令的服务端,这段日子已兑现了get、post的管理,援助二种form的解码;而且已融为意气风发体了mvc风格的编码框架,愈来愈多详细可参照。

  3.LayUI:那些是轶闻中面向后端开辟人士的Web框架,制版上是仿Bootstrap的风骨,集成了大气的插件,能够急忙完毕相关的web页面效用,愈来愈多详细可参看:。

 

五、完整封装及源代码分享

  这几个类型按SAEA简洁高效的不二等秘书诀开展编码的,超多地方都选拔的暗中认可值,无论是查看代码照旧继续衔接都超轻巧方便,下边是本项目标起步源码:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             ConsoleHelper.Title = "WebRedisManagerService";
 6 
 7             MvcApplication mvcApplication = new MvcApplication(10240, 3000);
 8 
 9             mvcApplication.Start();
10 
11             ConsoleHelper.WriteLine("WebRedisManager服务已启动");
12 
13             ConsoleHelper.WriteLine("http://localhost:39654/html/index.html,按回车结束......");
14 
15             Process.Start("http://localhost:39654/html/index.html");
16 
17             ConsoleHelper.ReadLine();
18         }
19     }

  更加的多源码请访谈 

 

转发请表明本文来源:
更加的多内容招待star小编的github:
若果发掘本文有哪些难点和别的提出,也随即应接调换~

源代码结构解析

从redis源码拆解解析看来的redis源码阅读方式,小编觉着这适用于广大源码的阅读:

  1. 自底向上:从耦合关系一点都不大的模块在这里早先读,然后稳步过度到事关密不可分的模块。就雷同写程序的测验相近,先从单元测量试验伊始,然后才到效果测量检验。
  2. 从成效入手:通过文件名(模块名卡塔尔和函数名,急忙牢固到八个功用的具体落实,然后追踪整个完成的周转流程,进而明白该效能的实现形式。
  3. 自顶向下:从程序的 main()
    函数,只怕某些特别大的调用者函数为输入,以深度优先也许广度优先的情势阅读它的源码。
  • Redis的数据结构部分
内存分配 zmalloc.c和zmalloc.h
动态字符串 sds.h和sds.c
双端链表 adlist.c和adlist.h
字典 dict.h和dict.c
跳跃表 server.h文件里面关于zskiplist结构和zskiplistNode结构,以及t_zset.c中所有zsl开头的函数

 

 

 

 

 

  • Redis的内存编码
整数集合 intset.h和intset.c
压缩列表 ziplist.h和ziplist.c
压缩表 zipmap.h和zipmap.c

 

 

 

  • Redis数据类型
对象 object.c
字符串对象 t_string.c
列表对象 t_list.c
散列对象 t_hash.c
集合对象 t_set.c
有序集合对象 t_zset.c中除 zsl 开头的函数之外的所有函数

 

 

 

 

 

  • Redis数据库的达成
数据库实现 db.c
RDB持久化 rdb.c
AOF持久化 aof.c
通知功能 notify.c

 

 

 

 

  • 客商端和劳动器端的代码达成
服务器端 redis.c
客户端 redis-cli.c
事件处理 ae.c/ae_epoll.c/ae_evport.c/ae_kqueue.c/ae_select.c
网络链接 anet.c和networking.c

 

 

 

 

  • Redis多机部分的代码实现
复制功能 replication.c
Redis Sentinel sentinel.c
集群 cluster.c

 

 

 

  • 独立成效模块的贯彻
发布和订阅 pubsub.c文件
事务 multi.c
lua脚本 scripting.c
慢查询 slowlog.c
监视 monitor.c

 

 

 

 

 

总体Redis的源码分类大意上如上所述了。

 

末尾参照他事他说加以考察了搜狐笔者Zeech的有关redis阅读的建议:

Redis简介

redis全称REmote DIctionary Server,是二个由Salvatore
Sanfilippo写的高品质key-value存款和储蓄系统,其完全开源无偿,服从BSD左券。Redis与其他key-value缓存付加物(如memcache卡塔 尔(英语:State of Qatar)有以下多少个特色。

  • Redis帮忙数据的持久化,能够将内部存款和储蓄器中的多寡保存在磁盘中,重启的时候能够重复加载实行应用。
  • Redis不止援助简单的key-value类型的数额,同不经常间还提供list,set,zset,hash等数据结构的仓储。
  • Redis帮助数据的备份,即master-slave方式的数据备份。

Redis的天性超级高且具备丰盛的数据类型,同不经常间,Redis全部操作都以原子性的,也协理对多少个操作归并后原子性的实行。别的,Redis有拉长的强大性情,它扶植publish/subscribe,
公告,key 过期等等特色。

此处贴出针对Zeech提供的读书提议,也足以催促协和,希望能够对找到工作有所帮忙。

首先品级

  • 翻阅Redis的数据结构部分,基本位于如下文件中:内部存款和储蓄器分配
    zmalloc.c和zmalloc.h
  • 动态字符串 sds.h和sds.c
  • 双端链表 adlist.c和adlist.h
  • 字典 dict.h和dict.c
  • 跳跃表
    server.h文件之中关于zskiplist结议和zskiplistNode结构,以致t_zset.c中享有zsl起始的函数,例如zslCreate、zslInsert、zslDeleteNode等等。
  • 基数总结 hyperloglog.c 中的 hllhdr 结构, 以至独具以 hll 起先的函数

第二阶段 熟谙Redis的内部存款和储蓄器编码结构

  • 卡尺头集合数据结构 intset.h和intset.c
  • 减去列表数据结构 ziplist.h和ziplist.c

其三等第 熟谙Redis数据类型的完结

  • 对象系统 object.c
  • 字符串键 t_string.c
  • 列表建 t_list.c
  • 散列键 t_hash.c
  • 集合键 t_set.c
  • 有序集合键 t_zset.c中除 zsl 伊始的函数之外的有所函数
  • HyperLogLog键 hyperloglog.c中具备以pf领头的函数

第四品级 熟谙Redis数据库的兑现

  • 数据库达成 redis.h文件中的redisDb结构,以至db.c文件
  • 照会成效 notify.c
  • RDB持久化 rdb.c
  • AOF持久化 aof.c

以至一些单身功用模块的达成

  • 发布和订阅 redis.h文件的pubsubPattern结构,甚至pubsub.c文件
  • 作业 redis.h文件的multiState结构以至multiCmd结构,multi.c文件

第五品级 熟习客商端和服务器端的代码完毕

  • 事件管理模块 ae.c/ae_epoll.c/ae_evport.c/ae_kqueue.c/ae_select.c
  • 网路链接库 anet.c和networking.c
  • 服务器端 redis.c
  • 客户端 redis-cli.c
  • 这时候能够阅读上边包车型地铁独自效能模块的代码完结
  • lua脚本 scripting.c
  • 慢查询 slowlog.c
  • 监视 monitor.c

第六等第 那意气风发品级首假如了然Redis多机部分的代码完毕

  • 复制作用 replication.c
  • Redis Sentinel sentinel.c
  • 集群 cluster.c

其它代码文件介绍

至于测量检验方面包车型地铁公文有:

  • memtest.c 内部存款和储蓄器检查评定
  • redis_benchmark.c 用于redis品质测量检验的落到实处。
  • redis_check_aof.c 用于修改日志检查的得以完成。
  • redis_check_dump.c 用于地点数据库检查的兑现。
  • testhelp.c 四个C风格的小型测量检验框架。

有的工具类的文书如下:

  • bitops.c GETBIT、SETBIT 等二进制位操作命令的达成
  • debug.c 用于调节和测量检验时选取
  • endianconv.c 高未有调换,差别种类,高未有顺序分化
  • help.h 支持于命令的提醒音讯
  • lzf_c.c 压缩算法种类
  • lzf_d.c 压缩算法体系
  • rand.c 用于发生随机数
  • release.c 用于发表时行使
  • sha1.c sha加密算法的得以完毕
  • util.c 通用工具方法
  • crc64.c 循环冗余校验
  • sort.c SORT命令的完结
  • 有的封装类的代码完毕:
  • bio.c background I/O的野趣,开启后台线程用的
  • latency.c 延迟类
  • migrate.c 命令迁移类,包蕴命令的回复迁移等
  • pqsort.c 排序算法类
  • rio.c redis定义的一个I/O类
  • syncio.c 用于协同Socket和文书I/O操作

发表评论