redis实践

4 篇文章 0 订阅
1 篇文章 0 订阅

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。

================

redis特点:
异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。

支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散列数据类型。这使得它非常容易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。

操作都是原子性:所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。

多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。

redis的安装以及配置
1.到官网http://redis.io下载压缩文件并解压
2.cd到redis根目录 cd /usr/local/redis-3.0.2
3.在redis根目录编译源程序:make
启动服务以及客户端连接
1.启动服务:在reids根目录下输入 src/redis-server
2.客户端连接:在reids根目录下输入 src/redis-cli

redis数据类型
1.string
2.hash
3.列表(list)
4.集合(set)
5.有序集合(zset)

redis数据库基本操作
1、插入数据,设置一个key-value对。
set name zpeng

2、查询数据,取出key所对应的value。
get name

3、删除键值,删除这个key及对应的value。
del name

4、验证键是否存在 ,其中0,代表此key不存在;1代表存在。
exists name \

5、 设置密码
config set requirepass 123456
config get requirepass
auth 123456

使用spring-redis对 redis CRUD
参考blog: http://blog.csdn.net/java2000_wl/article/details/8543203/
watch out:showcase使用maven构建

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.company.redis</groupId>
  <artifactId>spring2redis</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>  
    <dependency>  
        <groupId>org.springframework.data</groupId>  
        <artifactId>spring-data-redis</artifactId>  
        <version>1.0.2.RELEASE</version>  
    </dependency>  
    <dependency>  
        <groupId>org.springframework</groupId>  
        <artifactId>spring-test</artifactId>  
        <version>3.1.2.RELEASE</version>  
        <scope>test</scope>  
    </dependency>  

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

     <dependency>  
        <groupId>junit</groupId>  
        <artifactId>junit</artifactId>  
        <version>4.8.2</version>  
        <scope>test</scope>  
    </dependency>  
</dependencies>  
</project>

AbstractBaseRedisDao.java

package com.company.dao;

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.data.redis.core.RedisTemplate;  
import org.springframework.data.redis.serializer.RedisSerializer;  

/**  
 * AbstractBaseRedisDao 
 * @author http://blog.csdn.net/java2000_wl  
 * @version <b>1.0</b>  
 */   
public abstract class AbstractBaseRedisDao<K, V> {  

    @Autowired  
    protected RedisTemplate<K, V> redisTemplate;  

    /** 
     * 设置redisTemplate 
     * @param redisTemplate the redisTemplate to set 
     */  
    public void setRedisTemplate(RedisTemplate<K, V> redisTemplate) {  
        this.redisTemplate = redisTemplate;  
    }  

    /** 
     * 获取 RedisSerializer 
     * <br>------------------------------<br> 
     */  
    protected RedisSerializer<String> getRedisSerializer() {  
        return redisTemplate.getStringSerializer();  
    }  
}  

IUserDao.java

package com.company.dao;

import java.util.List;  

import com.company.entity.User;  

/**  
 * @version <b>1.0</b>  
 */   
public interface IUserDao {  

    /** 
     * 新增 
     * <br>------------------------------<br> 
     * @param user 
     * @return 
     */  
    boolean add(User user);  

    /** 
     * 批量新增 使用pipeline方式 
     * <br>------------------------------<br> 
     * @param list 
     * @return 
     */  
    boolean add(List<User> list);  

    /** 
     * 删除 
     * <br>------------------------------<br> 
     * @param key 
     */  
    void delete(String key);  

    /** 
     * 删除多个 
     * <br>------------------------------<br> 
     * @param keys 
     */  
    void delete(List<String> keys);  

    /** 
     * 修改 
     * <br>------------------------------<br> 
     * @param user 
     * @return  
     */  
    boolean update(User user);  

    /** 
     * 通过key获取 
     * <br>------------------------------<br> 
     * @param keyId 
     * @return  
     */  
    User get(String keyId);  
}  

UserDao.java

package com.company.dao;


import java.util.ArrayList;  
import java.util.List;  

import org.springframework.dao.DataAccessException;  
import org.springframework.data.redis.connection.RedisConnection;  
import org.springframework.data.redis.core.RedisCallback;  
import org.springframework.data.redis.serializer.RedisSerializer;  
import org.springframework.util.Assert;  

import com.company.dao.AbstractBaseRedisDao;  
import com.company.dao.IUserDao;  
import com.company.entity.User;  

/**  
* Dao 
* @version <b>1.0</b>  
*/   
public class UserDao extends AbstractBaseRedisDao<String, User> implements IUserDao {  

  /**  
   * 新增 
   *<br>------------------------------<br> 
   * @param user 
   * @return 
   */  
  public boolean add(final User user) {  
      boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {  
          public Boolean doInRedis(RedisConnection connection) throws DataAccessException {  
              RedisSerializer<String> serializer = getRedisSerializer();  
              byte[] key  = serializer.serialize(user.getId());  
              byte[] name = serializer.serialize(user.getName());  
              return connection.setNX(key, name);  
          }  
      });  
      return result;  
  }  

  /** 
   * 批量新增 使用pipeline方式   
   *<br>------------------------------<br> 
   *@param list 
   *@return 
   */  
  public boolean add(final List<User> list) {  
      Assert.notEmpty(list);  
      boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {  
          public Boolean doInRedis(RedisConnection connection) throws DataAccessException {  
              RedisSerializer<String> serializer = getRedisSerializer();  
              for (User user : list) {  
                  byte[] key  = serializer.serialize(user.getId());  
                  byte[] name = serializer.serialize(user.getName());  
                  connection.setNX(key, name);  
              }  
              return true;  
          }  
      }, false, true);  
      return result;  
  }  

  /**  
   * 删除 
   * <br>------------------------------<br> 
   * @param key 
   */  
  public void delete(String key) {  
      List<String> list = new ArrayList<String>();  
      list.add(key);  
      delete(list);  
  }  

  /** 
   * 删除多个 
   * <br>------------------------------<br> 
   * @param keys 
   */  
  public void delete(List<String> keys) {  
      redisTemplate.delete(keys);  
  }  

  /** 
   * 修改  
   * <br>------------------------------<br> 
   * @param user 
   * @return  
   */  
  public boolean update(final User user) {  
      String key = user.getId();  
      if (get(key) == null) {  
          throw new NullPointerException("数据行不存在, key = " + key);  
      }  
      boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {  
          public Boolean doInRedis(RedisConnection connection)  
                  throws DataAccessException {  
              RedisSerializer<String> serializer = getRedisSerializer();  
              byte[] key  = serializer.serialize(user.getId());  
              byte[] name = serializer.serialize(user.getName());  
              connection.set(key, name);  
              return true;  
          }  
      });  
      return result;  
  }  

  /**  
   * 通过key获取 
   * <br>------------------------------<br> 
   * @param keyId 
   * @return 
   */  
  public User get(final String keyId) {  
      User result = redisTemplate.execute(new RedisCallback<User>() {  
          public User doInRedis(RedisConnection connection) throws DataAccessException {  
              RedisSerializer<String> serializer = getRedisSerializer();  
              byte[] key = serializer.serialize(keyId);  
              byte[] value = connection.get(key);  
              if (value == null) {  
                  return null;  
              }  
              String name = serializer.deserialize(value);  
              return new User(keyId, name, null);  
          }  
      });  
      return result;  
  }  
}  

User.java

package com.company.entity;

import java.io.Serializable;  

public class User implements Serializable {  

    private static final long serialVersionUID = -6011241820070393952L;  

    private String id;  

    private String name;  

    private String password;  

    /** 
     * <br>------------------------------<br> 
     */  
    public User() {  

    }  

    /** 
     * <br>------------------------------<br> 
     */  
    public User(String id, String name, String password) {  
        super();  
        this.id = id;  
        this.name = name;  
        this.password = password;  
    }  

    /** 
     * 获得id 
     * @return the id 
     */  
    public String getId() {  
        return id;  
    }  

    /** 
     * 设置id 
     * @param id the id to set 
     */  
    public void setId(String id) {  
        this.id = id;  
    }  

    /** 
     * 获得name 
     * @return the name 
     */  
    public String getName() {  
        return name;  
    }  

    /** 
     * 设置name 
     * @param name the name to set 
     */  
    public void setName(String name) {  
        this.name = name;  
    }  

    /** 
     * 获得password 
     * @return the password 
     */  
    public String getPassword() {  
        return password;  
    }  

    /** 
     * 设置password 
     * @param password the password to set 
     */  
    public void setPassword(String password) {  
        this.password = password;  
    }  

    @Override
    public String toString() {
        return this.id + "+" + this.name + "+" + this.password;
    }
}  

Spring2RedisTest.java

package com.company.test;

import java.util.ArrayList;
import java.util.List;

import junit.framework.Assert;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;

import com.company.dao.IUserDao;
import com.company.entity.User;

/**  
 * 测试 
 * @author http://blog.csdn.net/java2000_wl  
 * @version <b>1.0</b>  
 */    
@ContextConfiguration(locations = {"classpath*:applicationContext.xml"})  
public class Spring2RedisTest extends AbstractJUnit4SpringContextTests {  
    @Autowired
    private IUserDao userDao;  

    /** 
     * 新增 
     * <br>------------------------------<br> 
     */  
    @Test  
    public void testAddUser() {  
        User user = new User();  
        user.setId("user2");  
        user.setName("123456");  
        user.setPassword("520loveu");
        boolean result = userDao.add(user);  
        Assert.assertTrue(result);  
    }  

    /** 
     * 批量新增 普通方式 
     * <br>------------------------------<br> 
     */  
    @Test  
    public void testAddUsers1() {  
        List<User> list = new ArrayList<User>();  
        for (int i = 10; i < 50000; i++) {  
            User user = new User();  
            user.setId("user" + i);  
            user.setName("java2000_wl" + i);  
            list.add(user);  
        }  
        long begin = System.currentTimeMillis();  
        for (User user : list) {  
            userDao.add(user);  
        }  
        System.out.println(System.currentTimeMillis() -  begin);  
    }  

    /** 
     * 批量新增 pipeline方式 
     * <br>------------------------------<br> 
     */  
    @Test  
    public void testAddUsers2() {  
        List<User> list = new ArrayList<User>();  
        for (int i = 10; i < 1500000; i++) {  
            User user = new User();  
            user.setId("user" + i);  
            user.setName("java2000_wl" + i);  
            list.add(user);  
        }  
        long begin = System.currentTimeMillis();  
        boolean result = userDao.add(list);  
        System.out.println(System.currentTimeMillis() - begin);  
        Assert.assertTrue(result);  
    }  

    /** 
     * 修改 
     * <br>------------------------------<br> 
     */  
    @Test  
    public void testUpdate() {  
        User user = new User();  
        user.setId("user1");  
        user.setName("new_password");  
        boolean result = userDao.update(user);  
        Assert.assertTrue(result);  
    }  

    /** 
     * 通过key删除单个 
     * <br>------------------------------<br> 
     */  
    @Test  
    public void testDelete() {  
        String key = "user1";  
        userDao.delete(key);  
    }  

    /** 
     * 批量删除 
     * <br>------------------------------<br> 
     */  
    @Test  
    public void testDeletes() {  
        List<String> list = new ArrayList<String>();  
        for (int i = 0; i < 10; i++) {  
            list.add("user" + i);  
        }  
        userDao.delete(list);  
    }  

    /** 
     * 获取 
     * <br>------------------------------<br> 
     */  
    @Test  
    public void testGetUser() {  
        String id = "user2";  
        User user = userDao.get(id);  
        System.out.println(user);
        Assert.assertNotNull(user);  
        Assert.assertEquals(user.getName(), "123456");  
    }  

    /** 
     * 设置userDao 
     * @param userDao the userDao to set 
     */  
    public void setUserDao(IUserDao userDao) {  
        this.userDao = userDao;  
    }  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值