文档章节

Redis的使用学习笔记

silence88
 silence88
发布于 2017/02/07 21:03
字数 2042
阅读 16
收藏 1

一、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

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

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

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

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

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

四、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中全部的数据保存一份到硬盘,如果数据非常多就不适合频繁地做该持久化操作

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

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

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

2、AOF持久化

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

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

频率的配置:

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

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

持久化生成的文件如下:

 

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

六、主从模式(master-slave)

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

 

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

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

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

七、使用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;
        }
    }


}

 

© 著作权归作者所有

silence88
粉丝 8
博文 71
码字总数 72855
作品 0
深圳
程序员
私信 提问
Lind.DDD.Repositories.Redis层介绍

之前已经发生了 大叔之前介绍过关于redis的文章,有缓存,队列,分布式pub/sub,数据集缓存以及仓储redis的实现等等,而今天在Lind.DDD的持久化组件里,redis当然也有一席之地,作为当今最红...

mcy247
2017/12/07
0
0
《Redis in action》读书笔记

https://www.gitbook.io/book/abcfy2/redis-in-action-reading-notes 最近在学习redis,正在看这本书,以笔记的形式记录下这本书,方便以后翻阅。 这本书介绍很不错,入门很值得参考,图文并...

Feng_Yu
2014/09/27
2.6K
0
redis学习笔记(三)之其他命令和特性

redis学习笔记(一)之安装测试 redis学习笔记(二)之数据类型 一、基本特性 1、reids 默认端口:6379; 2、默认支持16个数据库,建立连接后自动选择0号数据库,建议不同的应用使用不同的r...

憨豆公子
2016/08/19
56
0
win10 64位安装redis 及Redis Desktop Manager使用

1.下载 redis官方没有64位的Windows下的可执行程序,目前有个开源的托管在github上, 地址:https://github.com/ServiceStack/redis-windows 点击这个地方,下载文件并解压到自己的电脑目录下...

楠木楠
2016/12/10
8.2K
0
Redisson源码赏析 - 简介

转自官方wiki概述 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(, , , ...

3jin
2018/01/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何递归计算目录中的所有代码行?

我们有一个PHP应用程序,并希望计算特定目录及其子目录下的所有代码行。 我们不需要忽略评论,因为我们只是想弄清楚。 wc -l *.php 该命令在给定目录中运行良好,但忽略子目录。 我当时认为...

技术盛宴
39分钟前
4
0
使用 try-with-resources 优雅关闭资源

我们知道,在 Java 编程过程中,如果打开了外部资源(文件、数据库连接、网络连接等、redis),我们必须在这些外部资源使用完毕后,手动关闭它们。 因为外部资源不由 JVM 管理,无法享用 JVM ...

七弦桐
46分钟前
4
0
04.深入浅出索引(上)

简单来说,索引的出现就是为了提高数据查询效率,就像书的目录一样。 索引的常见模型 索引实现的方式有很多种,所以这里就引入了索引模型的概念,可以用于提高读写效率的数据结构很多,比较常...

scgaopan
49分钟前
5
0
Redis哨兵、复制、集群的设计原理,以及区别

谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制。 **哨兵(Sentinel):**可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的...

Java阿七
59分钟前
5
0
浅析laravel路由执行原理

目前很多文章已经对Laravel的执行原理做了详细介绍,这里只是为了个人做一下简单记录 首先看入口 index.php 关键的执行函数就是 handle方法 ,但是前面的几个预处理函数,包括了整合框架的大...

冻结not
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部