redis学习笔记

1、redis简介
        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可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。


2、下载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环境)





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值