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:  事件

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

 

 

 

 

 

 
 

posted on 2017-11-13 17:59  biyangqiang  阅读(250)  评论(0编辑  收藏  举报

导航