学习笔记整理

    技术2025-02-25  19

    分布式阻塞锁

    redis

    NOSQL

    Not Only SQL / Non-Relational SQL 泛指非关系型数据库

    非关系型数据库 它是关系型数据库有益的补充。最终的数据还是保存在关系型数据库中。非关系型数据库主要是提升数据库的查询速度,一般做为数据的缓存来使用。 应对基于海量用户和海量数据前提下的数据处理问题

    分类:

    键值存储数据库 redis集群(缓存) 列存储数据库 HBase 文档型数据库 MongoDB集群(文档) 图形(Graph)数据库 分布式文件系统(FastDFS集群) 热点信息 redis memcache tair 搜索关键字 ES Lucene solr(全文检索)

    优点:

    1. 格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。 2. 速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘; 3. 成本低:nosql数据库部署简单,基本都是开源软件。 4. 可扩容,可伸缩、大量数据下高性能

    缺点:

    1. 不提供sql支持,学习和使用成本较高; 2. 数据结构相对复杂,复杂查询方面不方便。

    解决问题

    High Performance - 数据库高并发访问 Huge Storage - 海量数据的存储 High Scalability && High Availability- 高可扩展性和高可用性的需求 关系型数据库 1. 磁盘IO性能低下-性能瓶颈 2. 数据关系复杂,扩展性差,不便于大规模集群-扩展瓶颈 非关系型数据库可以通过不断的添加服务器节点来实现扩展,而不需对原有的数据库进行维护。

    redis

    Remote Dictionary Server C语言编写、开源、key-value

    每次启动映射 Random Access Memory - RAM,将所有数据读取到内存中,可高效读取 数据间没有必然的关系 内部采用单线程机制进行工作 支持持久化,可以进行数据灾难恢复

    应用场景

    为热点数据加速查询(主要场景),如热点商品、热点新闻、热点资讯、推广类等高访问量信息 即时信息查询,如排行榜、网站访问统计、公交到站信息、在线人数信息(聊天室、直播)、设备信号等 时效性信息控制,如验证码控制、投票控制等 分布式数据共享,如分布式集群架构中的session分离 消息队列

    linux中安装

    gcc-c++ 环境 上传安装包(wget http://download.redis.io/releases/redis-5.0.0.tar.gz) 解压 tar -xvf redis-5.0.0.tar.gz 在解压目录编译 make 安装 make install 进入src 目录 运行 默认端口号:6379 redis-server [--port port] 指定端口启动服务器 redis-server [config_file_name] 指定配置文件启动服务器 redis-cli [-h host] [-p port] 指定ip与端口启动客户端

    windows下目录文件(Linux下差别只是扩展名)

    redis-benchmark.exe 用于性能测试一个工具命令 redis-check-aof.exeAOF 文件的检查和修复工具 (AOF是它的一种文件存储格式) redis-check-dump.exeRDB 文件的检查和修改工具 (RDB是它的一种文件存储格式) redis-cli.exe 客户端启动程序 redis-server.exe 服务器端启动程序 (不会自动启动,默认每次都要手动开启) redis.window.conf 服务器配置文件

    配置文件

    服务器 daemonize yes|no 设定以守护进程的方式运行,开启后控制台将打印服务器运行信息(同日志文件) bind 0.0.0.0 [...port] 绑定可连接的ip port 设定服务器端口 dir path 设置服务器文件保存地址 客户端 maxclients 最大客户端连接数,默认0,表示无限制,连接到达上限将拒绝新连接 timeout seconds 闲置最大等待时长,达到最大值后关闭对应连接,设置为0则关闭该功能 日志 loglevel debug|verbose|notice|warning 设置日志记录级别 (开发期verbose,生产中notice) lofile filename 指定日志文件

    数据类型

    Key-Value存储,数据类型指的是value的类型,key永远是字符串

    通用命令

    help [command] 查看帮助 key key * 查询所有的键 key pattern 查询指定key * 任意 ? 一个一个任意符号 [] 其中一个 del key 删除指定的key,不管其value是什么数据类型 exists key 是否存在 type key 获取键对应的value类型 sort key 排序 rname key newkey 改名 rnamenx key newkey 改名 expire key seconds 设置有效期 pexpire key milliseconds expireat key timestamp pexpireat key milliseconds-timestamp ttl key 获取key有效时间 pttl key 获取key有效时间 persist key 切换key由时效性转换为永久性 db move key db 数据移动 select db 选用指定的数据库分区 Redis中有db0-db15编号的16个数据库。我们不能创建新的数据库,也不能删除数据库。数据库中也没有表的结构,客户端默认连接第0个数据库。但可以通过配置文件设定有多少个数据库。 dbsize 查询本分区有多少个数据 flushall 清除所有数据 flushdb 清除当前分区所有数据

    string

    命名习惯:表名:主键名:主键值[:字段名] 值 示例 user:uid:1001:name jack 命令: set key value 如果已存在,直接覆盖 setnx key value 如果不存在就添加数据 mset k1 v1 [...k2 v2] 一次性存储多个multiple get key mget k1 [...key] 多数据操作时间比较单数据操作要少,存取时间,操作时间 append key value 在原先的值上追加,不存在则新建 strlen key 获取长度 setex key seconds value 设置指定存在时间 pestex key milliseconds value 设定指定存在时间 数字默认存储为字符串,遇到增incr/incrby/incrbyfloat 或减decr/decrby时转换为数值型进行计算 注意事项: 1. 数据操作不成功反馈与数据正常操作之间的差异 表成功与否: integer 0 false integer 1 true 表运行结果: integer 1 1个 2. 数据未获取到时,对应的数据为nil(null) 3. 最多可以容纳的数据长度是512M 4. 数值型默认存储为字符串,如果按数值操作,原始数据不能转换为数值或超过了数值上限(java中Long.MAX_VALUE),将报错

    list

    按照插入顺序排序的字符串链表(底层双向链表存储结构) 在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。 如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。 List中可以包含的最大元素数量是2^32-1个(43亿个) 有索引的概念,但是操作时通常以队列或栈的形式操作 命令: lpush/rpush key value [...value] 1个或多个元素 lpop/rpop key value 删除并返回 lrange key start stop 每个元素有2个索引号 索引号从左向右:0~length-1 索引号从右向左:-1~-length 如果要获取整个列表中所有的元素:0~-1(0到倒数第一个) lindex key index llen 获取有多少个元素 lrem key count value blpop key [...key] timeout 规定时间内获取并移除 blpop key [...key] timeout 规定时间内获取并移除 brpoppush source destination timeout 应用场景 1. 对数据进行分页操作,通常首页信息来源于list,后续来源于数据库 2. 多台服务器的日志文件的统一顺序输出(使用队列模型解决多路信息汇总合并) 3. 使用栈模型解决最新消息问题

    set

    无序集合,不允许重复元素 用的是hash的存储结构,但是无法使用其存储值的空间,仅使用其存储key的空间,在查询方面提供更高的效率 sadd key member [...member] scard 查看数据总数量 sismember key member 是否包含指定数据 srandmember key [count] 返回指定数量的随机数据 spop key [count] 随机获取,删除并返回 smembers key 获取所有 srem key member [...member] 删除数据 sinter key1 [...key2] 获取交集 sunion key1 [...key2] 获取并集 sdiff key1 [...key2] 获取差集 sinterstore destination key1 [...key2] 获取交集并存储到指定集合 sunionstore destination key1 [...key2] 获取并集并存储到指定集合 sdiffstore destination key1 [...key2] 获取差集并存储到指定集合 smove source destination member 移动数据到指定集合 应用场景: 网络爬虫黑名单、白名单: 1. 基于经营战略设定问题用户发现、鉴别规则 2. 周期性更新满足规则的用户黑名单,加入set集合 3. 用户行为信息达到后与黑名单进行比对,确认行为去向 5. 黑名单过滤IP地址:应用于开放游客访问权限的信息源 6. 黑名单过滤设备信息:应用于限定访问设备的信息源 7. 黑名单过滤用户:应用于基于访问权限的信息源 zset/sorted_set 有序的集合,允许重复元素 zadd key value score 以score升序排序,没有score就按照键的升序排列 zrange key start end zrem key value(键值对) 删除需要完整打出键值对 del key 删除sortedset zrevrange 倒序查询

    hash

    底层使用hash表结构实现数据存储(hash存储优化,如果field数量较少,存储结构优化为类数组结构;较多使用hashMap机构) 相当于java中的map集合,有key有value 最大存储2^32-1 命令: hset key field value hget key field hgetall key hmset key field value [...field value] hmget key field [...field] hlen key hsetnx hexists key field 是否包含 hdel key field [...field] 删除指定 del key 删除此hash hkeys key hvals key hincrby key field increment(可以为负数) hincrbyfloat key field increment 注意事项: 1. value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象,数据未获取到,对应nil。 2. 每个hash可以存储2^32 - 1 个键值对 3. hash的设计初衷并非为了存储大量对象,不可滥用 4. hgetall操作可以获取全部属性,但是field过多可能导致数据访问瓶颈 应用场景:抢购

    微信消息案例

    1. 依赖list的数据具有顺序的特征对消息进行管理,将list结构作为栈使用 2. 对置顶与普通会话分别创建独立的list分别管理 3. 当某个list中接收到用户消息后,将消息发送方的id从list的一侧加入list(此处设定左侧) 4. 多个相同id发出的消息反复入栈会出现问题,在入栈之前无论是否具有当前id对应的消息,先删除对应id 5. 推送消息时先推送置顶会话list,再推送普通会话list,推送完成的list清除所有数据 6. 消息的数量,也就是微信用户对话数量采用计数器的思想另行记录,伴随list操作同步更新

    Jedis

    Redis不仅可以使用客户端来操作,现在基本上主流的语言都有API支持,比如Java、C#、C++、PHP、Node.js、Go等。 在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis等,其中官方推荐使用Jedis和Redisson。 Jedis类常用方法 1. 每个方法就是redis中的命令名,方法的参数就是命令的参数。 2. 每个Jedis对象似于JDBC中Connection对象,获取一个Jedis对象本质上就是获取一个连接对象。

    JedisPool

    JedispoolConfig new JedisPoolConfig() void setMaxTotal(int maxCount) void setMaxWaitMillis(int maxMillis) 最长等待时间 ms JedisPool new JedisPool(上面的配置对象, 服务器名, 端口号)//配置文件指定对外ip Jedis getResource() 获取连接 Jedis new Jedis(String host, int port) void close()

    持久化

    RDB 针对数据存储,类似于快照

    手动save手动bgsave配置文件配置自动保存

    AOF 针对操作过程存储 appendfsync always|everysec|no AOF重写

    Processed: 0.008, SQL: 9