Redis学习笔记

Redis是一个开源的、基于内存数据结构存储器,可以用作数据库缓存消息中间件

参考:

1、基本知识

远程词典服务器(REmote Dictionary Server, Redis),Key-value存储系统

开源、BSD协议、支持网络、可基于网络亦可持久化的日志型、Key-Value数据库、提供多种语言的API


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

a、支持数据持久化

b、支持多种数据类型的存储

c、支持数据备份,master-slave模式的数据备份


Reids优势

a、性能高,读速度110000次/s,写81000次/s

b、丰富的数据类型,支持二进制的Strings, Lists, Hashes, Sets Orderd Sets

c、原子,单个操作原子行,多个操作支持事务

d、丰富的特性,支持publicsh/subscribe、通知以及key过期等等


Reids与其他key-value存储的不同

a、复杂的数据结构和原子性操作,无需额外抽象

b、运行在内存中可以持久化到磁盘


通常称为数据结构服务器,因为vuale可以是String、Hash、List、Sets和Sorted sets(有序集合)

2、前置知识

基本数据类型

 

String:Redis最基本的数据类型,最大512MB;二进制安全,可以包含任何数据,jpg图片或者序列化对象。操作:SET/GET/DEL。相当于key-value

Hash:键值对集合,每个hash存储2^32-1键值对;String类型的field和value的映射,适合初次存储对象。操作:HMSET/HMGET/DEL。相当于key-key-value

List:简单的String列表,按插入顺序排序,头部或者尾部插入。操作:lpush/lrange。相当于key-list

Set:String无序集合,不允许重复值,集合通过哈希表实现,添加、删除、查找的复杂度为1。操作:sadd/smembers。相当于key-set

Zset:String的有序集合,不允许重复值,关联double类型的分数,进行排序,值不同但是分数是可以重复的。操作:砸掉的zadd/zrangebyscore。相当于key-Zset

Hashset和HasheMap

hashset保存值,不允许值重复,hashmap保存key-value,不允许键重复


各个数据类型应用场景

类型

简介

特性

场景

String(字符串)

二进制安全

可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M

 

Hash(字典)

键值对集合,即编程语言中的Map类型

适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去)

存储、读取、修改用户属性

List(列表)

链表(双向链表)

增删快,提供了操作某一段元素的API

1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列

Set(集合)

哈希表实现,元素不重复

1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作

1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐

Sorted Set(有序集合)

将Set中的元素增加一个权重参数score,元素按score有序排列

数据插入集合时,已经进行天然排序

1、排行榜 2、带权重的消息队列

3Redis安装

下载地址:https://github.com/tporadowski/redis/releases,下载Redis-x64-5.0.9.zip文件 解压:在解压的目录下打开cmd窗口

执行:redis-server.exe redis.windows.conf

在同一目录下开启新的cmd窗口

执行:redis-cli.exe -h 127.0.0.1 -p 6379

设置键值对:set myset abc

取出键值对:get myset

 

4Redis配置

配置文件:redis.windows.conf

查看:CONFIG GET CONFIG_SETTING_NAME or CONFIG GET ×

修改:CONFIG SET CONFIG_SETTING_NAME NEWCONFIG_VALUE

具体参数配置用到再看

5Redis命令

redis命令

  • redis-cli.exe:进入redis服务,客户端。中文乱码加上 --raw
  • ping:看redis服务是否启动

常用key命令

  • DEL key:删除
  • DUMP key:序列化
  • EXPIRE:存在
  • RENAME key newkey:修改名称
  • TYPE key:返回类型

五种数据类型命令

HyperLogLog

  • 用来做基数统计的算法,就是不重复的数据集合,比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5 。操作:PFADD/PFCOUNT

Redis发布订阅

  • SUBSCRIBE redisChat:客户端A创建订阅频道,
  • PUBLISH redisCht:客户端B发布消息,客户端A接受

Redis事务

  • MULTI:进入事务
  • ... :一系列操作
  • EXEC :执行事务
  • 注意:不会会滚事务,操作具有原子性

Redis连接

  • AUTH "password":验证密码
  • PING:查看服务是否运行、
  • OUIT:关闭当前连接
  • SELECT index:切换到指定的数据库

6Redis高级

备份与恢复

  • SAVE:备份。保存至redis 安装目录中创建dump.rdb文件
  • 将dump.rdb文件 移动至redis安装目录,并启动服务
  • CONFIG GET dir:获取redis目录
  • BGSAVE:创建备份,并在后台执行

Redis安全

  • CONFIG get requirepass:查看是否设置了密码,默认为空
  • CONFIG set requirepass "mayl":设置密码
  • 设置密码后,客户端连接 redis 服务就需要密码验证,否则无法执行命令。
  • AUTH mayl:验证密码

Redis性能测试

  • $ redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q:以上实例中主机为 127.0.0.1,端口号为 6379,执行的命令为 set,lpush,请求数为 10000,通过 -q 参数让结果只显示每秒执行的请求数。

Redis客户端连接

  • Redis 通过监听一个 TCP 端口或者 Unix socket 的方式来接收来自客户端的连接,当一个连接建立后,Redis 内部会进行以下一些操作:
  • 首先,客户端 socket 会被设置为非阻塞模式,因为 Redis 在网络事件处理上采用的是非阻塞多路复用模型。

  • 然后为这个 socket 设置 TCP_NODELAY 属性,禁用 Nagle 算法

  • 然后创建一个可读的文件事件用于监听这个客户端 socket 的数据发送

Redis 管道技术

  • Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。

7JAVA中使用Redis

开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java。

Java redis驱动:

测试

package redis;

import java.util.Iterator;
import java.util.List;
import java.util.Set;

import redis.clients.jedis.Jedis;
 
public class RedisJava {
    public static void main(String[] args) {
        String password = "mayl";
        String ip = "127.0.0.1";
        int port = 6379;
        // 连接本地的 Redis 服务
        Jedis jedis = new Jedis(ip, port);
        System.out.println("连接成功");
        // 有密码时需要验证
        jedis.auth(password);
        System.out.println("验证成功");
        // 查看服务是否运行
        System.out.println("服务正在运行: "+jedis.ping());
        // 测试
        stringTest(jedis);
        listTest(jedis);
        keyTest(jedis);
    }
    
    public static void stringTest(Jedis jedis) {
        jedis.set("runoobkey", "www.runoob.com");
        // 获取存储的数据并输出
        System.out.println("redis 存储的字符串为: "+ jedis.get("runoobkey")); 
    }
    
    public static void listTest(Jedis jedis) {
      //存储数据到列表中
        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));
        }
    }
    
    public static void keyTest(Jedis jedis) {
        // 获取数据并输出
        Set<String> keys = jedis.keys("*"); 
        Iterator<String> it=keys.iterator() ;   
        while(it.hasNext()){   
            String key = it.next();   
            System.out.println(key);   
        }
    }
    
}

}

摘抄菜鸟会飞中的评论

1、哈希表复杂度

原文中说,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)其实不太准确。

其实在redis sorted sets里面当items内容大于64的时候同时使用了hash和skiplist两种设计实现。这也会为了排序和查找性能做的优化。所以如上可知: 

添加和删除都需要修改skiplist,所以复杂度为O(log(n))。 

但是如果仅仅是查找元素的话可以直接使用hash,其复杂度为O(1) 

其他的range操作复杂度一般为O(log(n))

当然如果是小于64的时候,因为是采用了ziplist的设计,其时间复杂度为O(n)

2、Redis数据库

注意:Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。

Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。这与我们熟知的在一个关系数据库实例中可以创建多个数据库类似,所以可以将其中的每个字典都理解成一个独立的数据库。

每个数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库(可以通过配置文件支持更多,无上限),可以通过配置databases来修改这一数字。客户端与Redis建立连接后会自动选择0号数据库,不过可以随时使用SELECT命令更换数据库,如要选择1号数据库:

redis> SELECT 1
OK
redis [1] > GET foo
(nil)

然而这些以数字命名的数据库又与我们理解的数据库有所区别。首先Redis不支持自定义数据库的名字,每个数据库都以编号命名,开发者必须自己记录哪些数据库存储了哪些数据。另外Redis也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么连一个数据库也没有权限访问。最重要的一点是多个数据库之间并不是完全隔离的,比如FLUSHALL命令可以清空一个Redis实例中所有数据库中的数据。综上所述,这些数据库更像是一种命名空间,而不适宜存储不同应用程序的数据。比如可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,但不适宜使用0号数据库存储A应用的数据而使用1号数据库B应用的数据,不同的应用应该使用不同的Redis实例存储数据。由于Redis非常轻量级,一个空Redis实例占用的内在只有1M左右,所以不用担心多个Redis实例会额外占用很多内存。

 


 


 


 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
尚硅谷是一个教育机构,他们提供了一份关于Redis学习笔记。根据提供的引用内容,我们可以了解到他们提到了一些关于Redis配置和使用的内容。 首先,在引用中提到了通过执行命令"vi /redis-6.2.6/redis.conf"来编辑Redis配置文件。这个命令可以让你进入只读模式来查询"daemonize"配置项的位置。 在引用中提到了Redis会根据键值计算出应该送往的插槽,并且如果不是该客户端对应服务器的插槽,Redis会报错并告知应该前往的Redis实例的地址和端口。 在引用中提到了通过修改Redis的配置文件来指定Redis的日志文件位置。可以使用命令"sudo vim /etc/redis.conf"来编辑Redis的配置文件,并且在文件中指定日志文件的位置。 通过这些引用内容,我们可以得出结论,尚硅谷的Redis学习笔记涵盖了关于Redis的配置和使用的内容,并提供了一些相关的命令和操作示例。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Redis学习笔记--尚硅谷](https://blog.csdn.net/HHCS231/article/details/123637379)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Redis学习笔记——尚硅谷](https://blog.csdn.net/qq_48092631/article/details/129662119)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值