redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。[1]
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
下载redis在Linux下的版本可去官网下载,官网没有支持windows环境下的redis。但是github上有资源,可自己构建exe程序。
但是懒人就可以直接从网上下载现有的:http://download.csdn.net/detail/polo_longsan/9538365。Windows下的使用一般很多时候可能都是作为一种学习环境。
下载之后如下:
redis-server.exe是redis服务器,redis-cli.exe是客户端。启动之后如图所示。
以上完成之后,可去http://doc.redisfans.com/查看,redis所有的命令和介绍。
把这个文档中的命令敲一遍之后,基本上redis差不多会了。
3、redis在java环境下的使用:jedis是redis在Java环境下的客户端。
需要jar包:jedis-2.1.0.jar和common-pools-1.5.5.jar。我因为使用了Spring和jedis一起使用,具体项目如下:
applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<!-- properties加载 -->
<bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath*:*.properties</value>
</list>
</property>
</bean>
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="false" />
<property name="properties" ref="configProperties" />
</bean>
<!-- jedis 连接池配置-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxActive" value="${redis.pool.maxActive}" />
<property name="maxIdle" value="${redis.pool.maxIdle}" />
<property name="maxWait" value="${redis.pool.maxWait}" />
<property name="testOnBorrow" value="${redis.pool.testOnBorrow}" />
</bean>
<!-- jedis 多个服务器配置-->
<bean id="jedisShardInfo1" class="redis.clients.jedis.JedisShardInfo">
<constructor-arg index="0" value="${redis1.ip}" />
<constructor-arg index="1" value="${redis1.port}" type="int" />
<!-- 如果配置了权限可开启 -->
<!-- <property value="${redis.password}" name="password"/> -->
</bean>
<!-- <bean id="jedisShardInfo2" class="redis.clients.jedis.JedisShardInfo">
<constructor-arg index="0" value="${redis2.ip}" />
<constructor-arg index="1" value="${redis2.port}" type="int" />
<!-- 如果配置了权限可开启 -->
<property value="${redis.password}" name="password"/>
</bean> -->
<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
<constructor-arg index="0" ref="jedisPoolConfig" />
<constructor-arg index="1">
<list>
<ref bean="jedisShardInfo1" />
<!-- <ref bean="jedisShardInfo2"/> -->
</list>
</constructor-arg>
</bean>
</beans>
redis.properties:
redis.pool.maxActive=1024
redis.pool.maxIdle=200
redis.pool.maxWait=10000
redis.pool.testOnBorrow=true
redis1.ip=127.0.0.1
redis1.port=6379
redis2.ip=127.0.0.1
redis2.port=6397
logback.xml:
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder 默认配置为PatternLayoutEncoder -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="ALL">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
Main.java:
package com.hua.redis;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
public class Main {
private static ShardedJedisPool shardedJedisPool=null;
@Before
public void init(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
if(shardedJedisPool==null){
shardedJedisPool=(ShardedJedisPool)applicationContext.getBean("shardedJedisPool");
}
}
/**
* redis存储字符串
* */
@Test
public void testString(){
ShardedJedis jedis=shardedJedisPool.getResource();
jedis.set("name", "zhang");
System.out.println(jedis.get("name"));
jedis.append("name", " is people's name");//拼接
System.out.println(jedis.get("name"));
jedis.del("name");
System.out.println(jedis.get("name"));
jedis.set("name", "zhangsan");
jedis.set("age", "23");
jedis.set("sex", "男");
// jedis.mset("name","zhangsan","age","23","sex","男");//设置多个键值对
jedis.incr("age");//加1操作
System.out.println(jedis.get("name")+","+jedis.get("age")+","+jedis.get("sex"));
jedis.set("token", "abcdefg001");
jedis.expire("token", 10);
System.out.println(jedis.ttl("token"));
try {
Thread.sleep(11000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("ttl:"+jedis.ttl("token"));
System.out.println(jedis.get("token"));
shardedJedisPool.returnResource(jedis);
}
/**
* redis操作Map
* */
@Test
public void testMap(){
ShardedJedis jedis=shardedJedisPool.getResource();
Map<String,String> map=new HashMap<String, String>();
map.put("name", "zhangsan");
map.put("age", "23");
map.put("sex", "男");
jedis.hmset("user", map);
List<String> list=jedis.hmget("user", "name","age","sex");
System.out.println(list);
//删除Map中的某个键值
jedis.hdel("user", "sex");
System.out.println(jedis.hmget("user", "sex"));
System.out.println(jedis.hlen("user"));//返回key为user的键中存放的值的个数2
System.out.println(jedis.exists("user"));//是否存在key为user的记录 返回true
System.out.println(jedis.hkeys("user"));//返回map对象中的所有key
System.out.println(jedis.hvals("user"));//返回map对象中的所有value
Iterator<String> iter=jedis.hkeys("user").iterator();
while(iter.hasNext()){
String key=iter.next();
System.out.println(key+":"+jedis.hget("user", key));
}
shardedJedisPool.returnResource(jedis);
}
/**
* redis操作list
* */
@Test
public void testList(){
ShardedJedis jedis=shardedJedisPool.getResource();
jedis.del("java framework");
System.out.println(jedis.lrange("java framework", 0, -1));
jedis.lpush("java framework", "Spring");
jedis.lpush("java framework", "Hibernate");
jedis.lpush("java framework", "Struts2");
System.out.println(jedis.lrange("java framework", 0, -1));
jedis.del("java framework");
jedis.rpush("java framework", "Spring");
jedis.rpush("java framework", "Hibernate");
jedis.rpush("java framework","Struts2");
System.out.println(jedis.lrange("java framework", 0, -1));
shardedJedisPool.returnResource(jedis);
}
/**
* jedis操作set集合
* */
@Test
public void testSet(){
ShardedJedis jedis=shardedJedisPool.getResource();
jedis.sadd("sporter", "田亮");
jedis.sadd("sporter", "林丹");
jedis.sadd("sporter", "姚明");
jedis.sadd("sporter", "郑智");
jedis.sadd("sporter", "who");
jedis.srem("sporter", "who");
jedis.srem("sporter", "haha");
System.out.println(jedis.smembers("sporter"));//获取所有加入的value
System.out.println(jedis.sismember("sporter", "who"));//判断 who 是否是user集合的元素
System.out.println(jedis.srandmember("sporter"));
System.out.println(jedis.scard("sporter"));//返回集合的元素个数
shardedJedisPool.returnResource(jedis);
}
/**
* 使用redis来进行排序
* */
@Test
public void testSort(){
ShardedJedis jedis=shardedJedisPool.getResource();
jedis.del("array");
jedis.rpush("array", "1");
jedis.rpush("array", "6");
jedis.rpush("array", "3");
jedis.rpush("array", "9");
jedis.rpush("array", "15");
jedis.rpush("array", "14");
jedis.rpush("array", "7");
System.out.println(jedis.lrange("array", 0, -1));
System.out.println(jedis.sort("array"));//输出排序后结果
System.out.println(jedis.lrange("array", 0, -1));
//返回资源
shardedJedisPool.returnResource(jedis);
}
}
说明:
1、ShardedJedisPool只有在redis服务集群的情况下才这么用,我现在配置的是;两台redis服务器集群的情况,因为本地只有一个redis服务器,所有主掉了一个配置。假如只是写一个测试程序,可直接实例化一个Jedis示例。
2、在运行程序之前,要先启动服务器。即redis-server.exe(Windows环境)