Redis的使用学习笔记

一、Redis 简介

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

二、Redis 优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

三、Redis安装

下载地址:https://github.com/MSOpenTech/redis/releases

可以直接下载压缩包解压出来使用。

203628_vyyw_3161152.png

为了方便在命令行中使用命令,将此目录配置下环境变量。

在redis所在根目录新建一个config文件夹存放自定义的配置文件,将实例配置文件redis.windows.conf拷贝一份到该目录下,重命名为redis.conf。

103304_CTrQ_3161152.png

启动服务:redis-server F:\redis\config\redis.conf,若不指定后面的配置参数则使用默认参数

103501_hS40_3161152.png

连接服务:redis-cli -h 127.0.0.1 -p 6379 。如果是在本机上使用则无需后面的ip和端口参数。

204235_AwMb_3161152.png

四、Redis对数据的操作

1、字符串

SET key value:设置指定 key 的值

GET key 获取指定 key 的值

APPEND key value 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾

STRLEN key 返回 key 所储存的字符串值的长度。

2、哈希(hash)

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象

HMSET key field1 value1 [field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中。

HSET key field value 将哈希表 key 中的字段 field 的值设为 value 

HGETALL key 获取在哈希表中指定 key 的所有字段和值

HGET key field 获取存储在哈希表中指定字段的值

3、列表(list)

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)

LPUSH key value1 [value2] 将一个或多个值插入到列表头部

LRANGE key start stop 获取列表指定范围内的元素

LLEN key 获取列表长度

4、集合(Set)

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

SADD key member1 [member2] 向集合添加一个或多个成员

SMEMBERS key 返回集合中的所有成员

5、有序集合(sorted set)

ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数

ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合成指定区间内的成员

五、Redis持久化

redis为了内部数据安全的考虑,会把内存中的数据以文件的形式保存一份到硬盘中,在服务器重启之后,会自动把硬盘的数据恢复到内存中。

持久化相关命令

bgsave:一部保存数据到硬盘(快照持久化)

shutdown:同步保存到服务器并关闭服务器

bgrewriteaof:当问及过长时优化aof文件的存储

1、快照持久化

该持久化默认开启,一次性把redis中全部的数据保存一份到硬盘,如果数据非常多就不适合频繁地做该持久化操作

备份的文件存放的目录由配置文件指定。

115625_gnqf_3161152.png

关于备份的频率配置说明:

120149_s9r9_3161152.png

配置的意思是:如果60秒内有10000个key发生了变化,则发起持久化操作,如果60秒内没有达到10000个,则看300秒内有没有达到10个key的修改,如果还没有则90秒内只要发生了一个key的修改则会发起持久化操作。

2、AOF持久化

把用户的每个写指令(添加、删除、修改指令)都备份到文件中,还原数据的时候则要执行这些指令。

默认的配置是关闭的,如果开启,则根据下面配置的备份策略进行备份。

121944_S5eD_3161152.png

频率的配置:

125433_FRy7_3161152.png

appendfsync always:只要收到写指令,则立即备份
appendfsync everysec:每秒钟备份一次,在性能和持久方面做了很好的折中,推荐使用
appendfsync no:完全依赖系统,如果系统空闲,则备份,持久化没有保障。

注意:如果开启了aof持久化,则redis重启后会默认从aof持久化的文件中取得备份的数据到内存中,不会从快照的持久化文件中加载数据。

持久化生成的文件如下:

131627_ytli_3161152.png

 

关于所有的redis操作命令参考:http://www.redis.cn/commands.html

六、主从模式(master-slave)

为了降低每个redis服务器的负载,可以设置几个redis服务,并做主从模式,一个服务器负责写入数据,其他服务器负责读数据,主服务器会自动同步数据到从服务器。

 

133432_JBRd_3161152.png

如何设置一台redis服务器为某个主服务器的从服务器:

修改你需要设置为从服务器的配置文件,配置主服务器的ip和端口即可,如下图:

133945_8l5P_3161152.png

注:如果配置了该配置值,则默认该服务器为从服务器,同时这台服务器也会默认不能写入数据,只能读数据。

七、使用java操作redis

1、下载驱动:jedis

http://search.maven.org/#search%7Cga%7C1%7Cjedis

2、连接redis

Jedis jedis = new Jedis("127.0.0.1");
System.out.println(jedis.ping());

3、操作数据

这里不做过多的说明,比较简单,直接贴代码

	    /**
		 * 操作字符串
		 */
		//存放字符串
		jedis.set("key1", "str1");
		//获取字符串
		System.out.println(jedis.get("key1"));
		//一次性设置多个字符串数据
		jedis.mset("key2", "str2","key3","str3");
		//删除某个key
		jedis.del("key2");
		
		/**
		 * 操作map
		 */
		Map<String,String> map = new HashMap<String,String>();
		map.put("name", "zxy");
		map.put("age", "20");
		jedis.hmset("people", map);
		
		Iterator<String> iter=jedis.hkeys("people").iterator();  
		while (iter.hasNext()){  
			String key = iter.next();  
			System.out.println(key+":"+jedis.hmget("people",key));  
		}  
		
		 //删除map中的某个键值  
		jedis.hdel("people","name");
		
		/**
		 * 操作List
		 */
		jedis.del("NOSQL");
		jedis.lpush("NOSQL","REDIS");  
		jedis.lpush("NOSQL","MONGODB");  
		jedis.lpush("NOSQL","MEMCACHE");  
		// 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有  
		System.out.println(jedis.lrange("NOSQL",0,-1)); 
		
		/**
		 * 操作set
		 */
        //添加  
        jedis.sadd("user","zhangsan");  
        jedis.sadd("user","wangwu");  
        jedis.sadd("user","lisi");
        //移除  
        jedis.srem("user","lisi");  
        
        System.out.println(jedis.smembers("user"));//获取所有加入的value  
        System.out.println(jedis.sismember("user", "wangwu"));//判断 who 是否是user集合的元素  
        System.out.println(jedis.srandmember("user"));//返回一个元素(不移除)  
        System.out.println(jedis.scard("user"));//返回集合的元素个数  

4、连接池

jedits的连接池额外需要commons-pool2包。

下载地址:http://search.maven.org/#search%7Cga%7C1%7Ccommons-pool2

package cn.zxy;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JeditpoolUtil {
	
	private JeditpoolUtil(){}

	private final static String HOST = "127.0.0.1";
	
	private final static int PORT = 6379;
	
	 //可用连接实例的最大数目,默认值为8;
    //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
    private static int MAX_ACTIVE = 1024;
    
    //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
    private static int MAX_IDLE = 200;
    
    //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
    private static long MAX_WAIT = 10000;
    
    private static int TIMEOUT = 10000;
    
    //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
    private static boolean TEST_ON_BORROW = true;
	
	private final static  JedisPool jedisPool ;
	
	static{
		JedisPoolConfig config = new JedisPoolConfig();
		
        config.setMaxTotal(MAX_ACTIVE);
        config.setMaxIdle(MAX_IDLE);
        config.setMaxWaitMillis(MAX_WAIT);
        config.setTestOnBorrow(TEST_ON_BORROW);
        
		jedisPool = new JedisPool(config,HOST,PORT,TIMEOUT);
		
	}
	
    /**
     * 获取Jedis实例
     */
    public synchronized static Jedis getJedis() {
        try {
            if (jedisPool != null) {
                Jedis resource = jedisPool.getResource();
                return resource;
            } else {
                return null;
            }
        } catch (Exception e) {

            return null;
        }
    }


}

 

转载于:https://my.oschina.net/silence88/blog/833601

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值