zoukankan      html  css  js  c++  java
  • Redis学习笔记

     

    PS:
    Web1.0只能看不能互动 Web2.0是可以互动的(点赞)
    随着web2.0的兴起,非关系统数据库(Nosql)就火了起来,
    PS : 他去掉了那些传统的数据库的关系,没有数据类型更加了灵活

    1. 学习要根据What  Why  How  然后掌握他。

    What

    -----------------------------------------------------------------

    Redis(Remote dictionary Server) 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

    Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

    --------------------特点----------------------------------------------

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

    ----------------------------------------------------------------------

    Redis与其他key-value存储有什么不同?

    • Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。

    • Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

    • ------------------------------------------------------------------------------

    How

    ------------------------------------------------------------

    安装:http://www.runoob.com/redis/redis-install.html

    配置参数:http://www.runoob.com/redis/redis-conf.html

    PS:注意两点

    1.先和Redis建立链接  redis-server.exe redis.windows.conf

     2.然后就行值存取       redis-cli.exe -h 127.0.0.1 -p 6379                 需要开启两个 cmd窗口

     --------------------------------------------------------------

    Linux 安装

    PS: 单机版有16个,并且库与库是隔离的;集群只有一个0库

    PS: 这是我保存的redis 字符串类型

     ---------------------------------------------------------

    Redis 数据类型( 其实都是保存的都是string类型的)

     PS : 集群安装不明白的地方可参考taotao项目安装

     ------------------------------------------

    String(字符串)

    string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。

    string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。

    string类型是Redis最基本的数据类型,一个键最大能存储512MB。

    实例

    redis 127.0.0.1:6379> SET name "runoob"
    OK
    redis 127.0.0.1:6379> GET name
    "runoob"
    --------------------------------------------

    在以上实例中我们使用了 Redis 的 SET 和 GET 命令。键为 name,对应的值为 runoob

    注意:一个键最大能存储512MB。


    Hash(哈希)  其实就是专门放  String的键值对集合

    Redis hash 是一个键值(key=>value)对集合

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

    实例

    127.0.0.1:6379> HMSET user:1 username runoob password runoob points 200
    OK
    127.0.0.1:6379> HGETALL user:1
    1) "username"
    2) "runoob"
    3) "password"
    4) "runoob"
    5) "points"
    6) "200"
    -------------------------------------------------------------------

    以上实例中 hash 数据类型存储了包含用户脚本信息的用户对象。 实例中我们使用了 Redis HMSET, HGETALL 命令,user:1为键值

    每个 hash 可以存储 232 -1 键值对(40多亿)。

    List(列表)

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

    1.从左侧添加,也可以lpop和rpop


    列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

    Set(集合)

    Redis的Set是string类型的无序集合

    集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

    sadd 命令

    添加一个string元素到,key对应的set集合中,成功返回1,如果元素已经在集合中返回0,key对应的set不存在返回错误。

    sadd key member

    实例

    redis 127.0.0.1:6379> sadd runoob redis
    (integer) 1
    redis 127.0.0.1:6379> sadd runoob mongodb
    (integer) 1
    redis 127.0.0.1:6379> sadd runoob rabitmq
    (integer) 1
    redis 127.0.0.1:6379> sadd runoob rabitmq
    (integer) 0
    redis 127.0.0.1:6379> smembers runoob
    
    1) "rabitmq"
    2) "mongodb"
    3) "redis"

    注意:以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。

    集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。 

    zset(sorted set:有序集合)

    PS: 应用场景
    应用排名
    游戏排名
    话题排名
    Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员

    不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序

    zset的成员是唯一的,但分数(score)却可以重复。

    zadd 命令

    添加元素到集合,元素在集合中存在则更新对应score

    zadd key score member 

    实例

    redis 127.0.0.1:6379> zadd runoob 0 redis
    (integer) 1
    redis 127.0.0.1:6379> zadd runoob 0 mongodb
    (integer) 1
    redis 127.0.0.1:6379> zadd runoob 0 rabitmq
    (integer) 1
    redis 127.0.0.1:6379> zadd runoob 0 rabitmq
    (integer) 0
    redis 127.0.0.1:6379> ZRANGEBYSCORE runoob 0 1000
    
    1) "redis"
    2) "mongodb"
    3) "rabitmq"
     

    注意:以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。

    集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

    ----------------------------------------------------------------------------------------------

    3.Redis 命令

    Redis 命令用于在 redis 服务上执行操作。

    要在 redis 服务上执行命令需要一个 redis 客户端。Redis 客户端在我们之前下载的的 redis 的安装包中。

    语法

    Redis 客户端的基本语法为:

    $ redis-cli
     

    -----------------------------------------

    Redis 键(key)

    Redis 键命令用于管理 redis 的键。  主要是对 的增删查改

    http://www.runoob.com/redis/redis-keys.html

    ------------------------------------------------------------------------------------------------------------

    Redis 字符串(String)

    Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下:                   主要是对字符串的操作

    语法

    redis 127.0.0.1:6379> COMMAND KEY_NAME

    实例

    redis 127.0.0.1:6379> SET runoobkey redis
    OK
    redis 127.0.0.1:6379> GET runoobkey
    "redis"
    ----------------------------------------------------------

    Redis 哈希(Hash)  

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

    Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

    ----------------------------------------
    其他的也是这样,不再一一列举
    --------------------------------------------

     

    PS : RDB保存的是数据库

           aof保存的是命令

    5.Redis HyperLogLog

    Redis 在 2.8.9 版本添加了 HyperLogLog 结构。

    Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

    在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

    但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。


    什么是基数?

    比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。


    实例

    以下实例演示了 HyperLogLog 的工作过程:

    redis 127.0.0.1:6379> PFADD runoobkey "redis"
    
    1) (integer) 1
    
    redis 127.0.0.1:6379> PFADD runoobkey "mongodb"
    
    1) (integer) 1
    
    redis 127.0.0.1:6379> PFADD runoobkey "mysql"
    
    1) (integer) 1
    
    redis 127.0.0.1:6379> PFCOUNT runoobkey
    
    (integer) 3

     -------------------------------------------------------------------------------------

    Redis 发布订阅    不太知道这种模式是用来干什么的

    Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

    Redis 客户端可以订阅任意数量的频道。

    下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

    pubsub1

    当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

    pubsub2

    ----------------------------------------------------------------------

    Redis 事务

    Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:

    • 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
    • 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

    一个事务从开始到执行会经历以下三个阶段:

    • 开始事务。
    • 命令入队。
    • 执行事务。
    • ------------------------------------------------------------

    Redis 脚本

    Redis 脚本使用 Lua 解释器来执行脚本。 Reids 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL

    语法

    Eval 命令的基本语法如下:

    redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]

    实例

    以下实例演示了 redis 脚本工作过程:

    redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
    
    1) "key1"
    2) "key2"
    3) "first"
    4) "second"
    ---------------------------------------------------------------------

    Redis 服务器

    Redis 服务器命令主要是用于管理 redis 服务。

    -----------------------------------------------------------------------------------------------

    Redis 数据备份与恢复

    Redis SAVE 命令用于创建当前数据库的备份。

    http://www.runoob.com/redis/redis-backup.html

    ----------------------------------------------------------------------------------

    Redis 安全                   主要是设置密码

    我们可以通过 redis 的配置文件设置密码参数,这样客户端连接到 redis 服务就需要密码验证,这样可以让你的 redis 服务更安全。

    http://www.runoob.com/redis/redis-security.html

    ----------------------------------------------------------------------------------------------------

    Redis 性能测试

    Redis 性能测试是通过同时执行多个命令实现的。

    语法

    redis 性能测试的基本命令如下:

    redis-benchmark [option] [option value]

    实例

    以下实例同时执行 10000 个请求来检测性能:

    redis-benchmark -n 10000
    -----------------------------------------------

    Redis 客户端连接        主要是对客户端进行连接管理  ,例如数据库连接池

    Redis 通过监听一个 TCP 端口或者 Unix socket 的方式来接收来自客户端的连接,当一个连接建立后,Redis 内部会进行以下一些操作:

    • 首先,客户端 socket 会被设置为非阻塞模式,因为 Redis 在网络事件处理上采用的是非阻塞多路复用模型。
    • 然后为这个 socket 设置 TCP_NODELAY 属性,禁用 Nagle 算法
    • 然后创建一个可读的文件事件用于监听这个客户端 socket 的数据发送

    最大连接数

    在 Redis2.4 中,最大连接数是被直接硬编码在代码里面的,而在2.6版本中这个值变成可配置的。

    maxclients 的默认值是 10000,你也可以在 redis.conf 中对这个值进行修改。

    config get maxclients
    
    1) "maxclients"
    2) "10000"

    实例

    以下实例我们在服务启动时设置最大连接数为 100000:

    redis-server --maxclients 100000
    ---------------------------------------------

    Redis 管道技术    主要是为了提升执行的性能 类似于Linux

    Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:

    • 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
    • 服务端处理命令,并将结果返回给客户端。

    -------------------------------------------------------------------------------------------

    Redis 分区

    分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集。

    分区的优势

    • 通过利用多台计算机内存的和值,允许我们构造更大的数据库。
    • 通过多核和多台计算机,允许我们扩展计算能力;通过多台计算机和网络适配器,允许我们扩展网络带宽。

    分区的不足

    redis的一些特性在分区方面表现的不是很好:

    • 涉及多个key的操作通常是不被支持的。举例来说,当两个set映射到不同的redis实例上时,你就不能对这两个set执行交集操作。
    • 涉及多个key的redis事务不能使用。
    • 当使用分区时,数据处理较为复杂,比如你需要处理多个rdb/aof文件,并且从多个实例和主机备份持久化文件。
    • 增加或删除容量也比较复杂。redis集群大多数支持在运行时增加、删除节点的透明数据平衡的能力,但是类似于客户端分区、代理等其他系统则不支持这项特性。然而,一种叫做presharding的技术对此是有帮助的。
    • 主要是为了分区保存数据

    ------------------------------------

    Java 使用 Redis(Jedis)

    PS:把我之前都保存下来了,因此应该是这样的

    1.配置Redis的环境

    2.java放入jar包,然后操作都是在的那个 xxx.rdb里面保存的

    import java.util.Iterator;
    import java.util.List;
    import java.util.Set;
    
    import redis.clients.jedis.Jedis;
    
    public class Main {
        public static void main(String[] args) {
             Jedis jedis = new Jedis("localhost");//ip地址,一般都是linux服务器的地址
            //查看服务是否运行
             System.out.println("服务正在运行: "+jedis.ping());
             //保存设置String类型数据
             jedis.set("myKey", "托尔斯泰");
             System.out.println("redis 存储的字符串为: "+ jedis.get("myKey"));
             
                 jedis.lpush("site-list", "Runoob");
                jedis.lpush("site-list", "Google");
                jedis.lpush("site-list", "Taobao");
                // 获取存储的数据并输出
                List<String> list = jedis.lrange("site-list", 0 ,2);
                for(int i=0; i<list.size(); i++) {
                    System.out.println("列表项为: "+list.get(i));
                }
                
                // 获取数据并输出
                Set<String> keys = jedis.keys("*"); 
                Iterator<String> it=keys.iterator() ;   
                while(it.hasNext()){   
                    String key = it.next();   
                    System.out.println(key);   
                }
              /*  服务正在运行: PONG
                redis 存储的字符串为: 托尔斯泰
                列表项为: Taobao
                列表项为: Google
                列表项为: Runoob
                myKey
                runoob
                setT
                site-list
                user:1*/
    
        }
    }


    jedis:连接池(JedisPool)使用示例

    Jedis连接池https://www.cnblogs.com/xinruyi/p/9391140.html

    
    

     

     PS: Redis也专门用C实现了自己的链表

     PS: Redis也专门用C实现了自己的Map

    PS: 

    PS: 整数集合

    PS:压缩列表

     PS:  事件

    ------------------------------------------------------------------------------------------------------------------------------------------

     

     
     
  • 相关阅读:
    A
    B
    A
    A
    B
    C
    有趣的平方和的推导
    一篇写的非常好的匈牙利算法文章
    2014 UESTC Training for Data Structures G
    2014 UESTC Training for Data Structures H
  • 原文地址:https://www.cnblogs.com/bee-home/p/7827452.html
Copyright © 2011-2022 走看看