redis学习笔记

原创 2016年06月01日 22:05:27

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环境)





版权声明:本文为博主原创文章,未经博主允许不得转载。

Redis学习笔记-进阶

Redis持久化方案 redis有rdb和aof两种持久化方案 1)rdb方式 当符合一定条件时会自动将内存中的所有数据执行快照操作并存储到硬盘上默认存储在redis根目录的dump.r...
  • daboaxiaoyu
  • daboaxiaoyu
  • 2016年09月14日 16:15
  • 132

安全测试工具收集

持续收集中...   JAD - Java反编译工具   Flash Decompilerhttp://www.flash-decompiler.com/从FLASH文件swf中提取所有资源的工具软件...
  • Testing_is_believing
  • Testing_is_believing
  • 2010年12月08日 22:50
  • 8720

Redis系列学习笔记3 散列

散列储存多个域值对。一个散列由多个域值对(field-value pair)组成,散列的域和值都可以是文字、整数、浮点数或者二进制数据。同一个散列里面的每个域必须是独一无二、各不相同的,而域的值则没有...
  • ECHO_FOLLOW_HEART
  • ECHO_FOLLOW_HEART
  • 2016年05月23日 16:02
  • 420

redis学习笔记(14)---redis基本命令总结

概述 Redis的键值可以使用物种数据类型:字符串,散列表,列表,集合,有序集合。本文详细介绍这五种数据类型的使用方法。本文命令介绍部分只是列举了基本的命令,至于具体的使用示例,可以参考Redis官方...
  • u012658346
  • u012658346
  • 2016年05月10日 15:11
  • 3399

Spring Data Redis 学习(一)

Spring-data-redis简介 1.Redis是一种面向“键/值”对类型数据的分布式NoSQL数据库系统 2.包含的特性: 高性能持久存储适应高并发的应用场景 ...
  • chunzhiyan
  • chunzhiyan
  • 2016年03月31日 16:58
  • 480

redis学习笔记。

Redis的物种5种数据类型 一、五种基本类型 keys * exists key_name del key_name type key_name #用来返回键对应的数据类型 ...
  • tegro
  • tegro
  • 2015年08月30日 09:59
  • 99

《Redis设计与实现》学习笔记-服务端

Redis服务器负责与多个客户端建立连接,处理客户端请求,保存各个数据库状态。通过使用由I/O多路复用技术实现的事件处理器,Redis服务器采用单线程单进程处理客户端命令请求。Redis通过redis...
  • pentiumchen
  • pentiumchen
  • 2015年03月19日 23:18
  • 637

《Redis设计与实现》学习笔记-客户端

Redis通过一个redisClient结构体来保存客户端当前的状态信息和执行相关功能时需要用到的数据结构,包括: 套接字描述符名字flags属性输入缓冲区输出缓冲区当前要执行的命令与命令参...
  • pentiumchen
  • pentiumchen
  • 2015年03月18日 23:18
  • 687

《Redis设计和实现》读书笔记1-简单动态字符串

临近过年,我离开了实习了4个多月的扇贝。临走前,导师赠送给我一本《Redis设计和实现》,于是心血来潮,想读一读这本书,然后仿照书中介绍的原理实现一个小型的数据库。这是redis系列的第一篇博文,希望...
  • u012422440
  • u012422440
  • 2016年02月02日 22:42
  • 473

Redis学习笔记二——redis安装

Windows下Redis安装 下载windows版本redis 解压下载的压缩包即为下图的内容: 启动的三种方式: 进入downloads文件夹选择需要的版本解压进入文件夹: 第一种方式不加...
  • a491857321
  • a491857321
  • 2016年07月19日 13:55
  • 786
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:redis学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)