草庐IT

Redis 安装与使用

NoSQL1.定义NoSQL(NotOnlySQL)即不仅仅是SQL,泛指非关系型的数据库2.为什么使用NoSQL?传统关系数据库在应付动态网站、特别是超大规模和高并发的纯动态网站已经显得力不从心了,如商品网站中对商品数据的频繁查询、热搜商品的排行统计、订单超时问题。虽然能实现功能,但性能不乐观,而且实现异常复杂,nosql的出现更好地解决了这些问题3.分类键值存储数据库:说明:主要使用哈希表,这个表有一个特定的键和一个指针指向特定的数据特点:简单易部署,海量数据下对其中部分值进行查询或更新时,效率低下相关产品:Redis、SSDB列存储数据库:说明:通常用来应付分布式存储的海量数据特点:键依

Redis进阶(一)

 通过简单的KV数据库理解Redis分为访问模块,操作模块,索引模块,存储模块 底层数据结构  除了String类型,其他类型都是一个键对应一个集合,键值对的存储结构采用哈希表哈希表由多个哈希桶组成,桶中存储entry元素,存储key和value的地址但是当hash冲突元素过多会导致查询效率变慢,所以引入rehash操作 采用两个全局hash表,但是从一个哈希表复制到另一个哈希表肯定会造成线程阻塞,所以使用渐进式哈希:分摊到多次拷贝接受第一次请求就拷贝第一个索引的entry元素,下一次再拷贝第二个,以此类推 对于集合类型的底层数据结构:双向链表,压缩列表,哈希表,跳表,整数数组压缩列表:跳表:

Redis 哈希Hash底层数据结构

1.Redis底层数据结构Redis数据库就像是一个哈希表,首先对key进行哈希运算得到哈希值再取模得到一个下标,每个元素是一个节点,节点之间形成链表。这感觉有点像Java中的HashMap。不同的数据类型的实现方式是不一样的,可以通过objectencoding命令查看底层真正的数据存储结构同一种类型在不同的条件下所采用的数据结构也不一样,例如:Redis是键值对形式的数据库,key可以是任意值(PS:最终都会转成string),value有多种数据类型详见:https://redis.io/docs/manual/data-types/data-types-tutorial/至此,已经很清

Redis SCAN命令

1.获取指定前缀的key需求描述:Redis中有大量以xxx开头的key,在不使用keys命令的情况下,如何快速获取这些前缀的key解决方案:redis自带的scan命令可以解决这个问题2.SCAN命令SCAN是一个基于游标的迭代器。这意味着在每次调用该命令时,服务器都会返回一个更新后的游标,用户需要在下一次调用中使用它作为游标参数。当游标设置为0时开始迭代,当服务器返回的游标为0时终止迭代。从游标值为0开始迭代,并调用SCAN直到返回的游标再次为0,这称为完整迭代。时间复杂度:每次调用O(1)。O(N)用于完整的迭代,包括足够的命令调用以使光标返回0。N是集合内的元素数。和scan命令相关的

一文搞懂 Redis 架构演化之路

现如今Redis变得越来越流行,几乎在很多项目中都要被用到,不知道你在使用Redis时,有没有思考过,Redis到底是如何稳定、高性能地提供服务的?我使用Redis的场景很简单,只使用单机版Redis会有什么问题吗?我的Redis故障宕机了,数据丢失了怎么办?如何能保证我的业务应用不受影响?为什么需要主从集群?它有什么优势?什么是分片集群?我真的需要分片集群吗?...如果你对Redis已经有些了解,肯定也听说过「数据持久化、主从复制、哨兵、分片集群」这些概念,它们之间又有什么区别和联系呢?如果你存在这样的疑惑,这篇文章,我会从0到1,再从1到N,带你一步步构建出一个稳定、高性能的Redis集群

[go-redis] go操作redis数据库

先上命令速查网站,菜鸟yydshttps://www.runoob.com/redis/redis-strings.html操作redis的包是go-redis/redis官方文档https://redis.uptrace.dev/guide/githubhttps://github.com/go-redis/redis创建项目创建test文件夹创建Redis_test.go文件直接上代码,代码解释全写在注释里packagetestimport( "context" "encoding/json" "fmt" "github.com/go-redis/redis/v8" "testing" "

Redis学习

Redis因为没有指定配置文件需配置redis-serverredis.windows.conf之后自动启动测试性能redis-benchmark-p6379-c100-n10000基础概念:清空当前数据库:flushdb清空全部数据库:flushallredis是单线程的redis的瓶颈是机器的内存和网络的带宽,用单线程既然可以实现,就用单线程了为什么单线程还这么快呢redis是将所有的数据全部放在内存中,所以说用单线程操作效率最高,多线程(cpu上下文会切换:耗时的操作),对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个cpu上,在内存情况下,这个就是最佳的选择。底层

mongodb 数据块迁移的源码分析

1.简介上一篇我们聊到了mongodb数据块的基本概念,和数据块迁移的主要流程(详见mongodb数据块的迁移流程介绍),这篇文章我们聊聊源码实现部分。2.迁移序列图数据块迁移的请求是从配置服务器(configserver)发给(donor,捐献方),再有捐献方发起迁移请求给目标节点(recipient,接收方),后续迁移由捐献方和接收方配合完成。数据迁移结束时,捐献方再提交迁移结果给配置服务器,三方交互序列图如下: 可以看到,序列图中的5个步骤,是对应前面文章的迁移流程中的5个步骤,其中接收方的流程控制代码在migration_destination_manager.cpp中的_migrat

分布式锁

分布式锁本文整理自黑马程序员相关资料问题的引入在平时单服务的情况下,我们使用互斥锁可以保证同一时刻只有一个线程执行自己的业务。原理是,在JVM内部维护了一个锁监视器,锁监视器保证了同一时刻只有一个线程获取到锁。但是如果开启了多个服务,就会有多个JVM,从而有多个不同的锁监视器,每个锁监视器监视自己JVM内部的线程,因此一个JVM内部的线程获取到锁,并不影响其他JVM内部的线程获取锁。从而导致并发安全问题。因此,我们需要独立于JVM之外的锁监视器对所有的线程统一管理。概念满足分布式系统或集群模式下多进程可见并且互斥的锁。常见分布式锁的实现比较MySQLRedisZookeeper互斥利用Mysq

缓存穿透,缓存雪崩,缓存击穿

缓存穿透,缓存雪崩,缓存击穿本文整理自黑马程序员相关资料缓存穿透缓存穿透是指客户端请求的数据在缓存中和数据库中都部存在,这样缓存永远不会生效。因此这些请求都会穿过缓存,最终请求到数据库上,对数据库造成非常大的压力。常见的解决方案有两种:缓存空对象:当缓存和数据库都没有请求的数据时,将查询的key的value设置为NULL值缓存到Redis中,下次再查询时会在Redis中查到NULL值,请求不会到达数据库。优点:实现简单,维护方便缺点:因为缓存了空对象,任意key的查询都缓存了NULL值,相当于缓存了很多的无用数据。所以造成了额外了内存消耗。可以通过设置TTL过期时间来减少内存的消耗可能会存在短