• Redis学习笔记(1)


    NoSQL

    为什么要使用NoSQL

    单个数据库架构下,数据存储的瓶颈是什么?

    1. 数据量过大,一个机器放不下
    2. 数据索引过大,一个机器的内存放不下
    3. 读写混合情况下的访问量一个实例无法承受

    Web数据库架构的发展

    1. 优化数据库的结构和索引,使用缓存技术缓解数据库的压力(Memcached+MySQL+垂直拆分)

    2. MySQL主从复制和读写分离

    3. 分库分表+水平拆分+MySQL集群

    4. MySQL的扩展性瓶颈:扩展性差、大数据下IO压力大、表结构更改困难

    5. 如今:负载均衡等一系列架构

    为什么使用NoSQL?

    传统数据库难以处理网状数据或大量无固定结构的数据

    NoSQL的特点

    易扩展:数据之间无关系

    大数据量高性能:NoSQL的Cache是记录级,MySQL的Cache是QueryCache,粒度不同

    灵活的数据类型:随时可以存储自定义的数据格式

    RDBMS vs NoSQL

    RDBMS(Relational Database Management System):

    • ACID
    • 高度组织化结构化数据
    • 结构化查询语言
    • 数据和关系都存储在单独的表中
    • 事务

    NoSQL:

    • Not Only SQL
    • 没有声明性查询语言
    • 没有预定义的模式
    • K-V存储、列存储、文档存储、图形数据库等
    • 最终一致性,而非ACID
    • 非结构化和不可预知的数据
    • CAP定理
    • 高性能、高可用性和可伸缩性

    K-V、Cache和Persistence

    Redis一个高性能的K-V分布式内存数据库

    Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启时可以再次加载进行使用

    Redis不仅支持简单的K-V(string)型数据,还支持list、set、zset、hash等数据结构的存储

    Redis支持数据的备份,即master-slave模式的数据备份

    NoSQL经典应用:淘宝网商品的相关数据

    1. 商品基本信息: MySQL/Oracle
    2. 商品描述、详情、评价信息(多文字类):文档数据库MongoDB
    3. 商品图片:分布式文件系统(淘宝的TFS、Google的GFS、Hadoop的HDFS)
    4. 商品关键字:ISearch
    5. 商品的波段性的热点高频信息:Tair、Redis、Memcached
    6. 商品的交易、价格计算、积分累计:支付宝和第三方支付接口

    难点:数据类型多样化、数据源多样化和变化重构、数据源和数据服务的耦合

    解决方案:统一数据平台服务层(UDSL)

    NoSQL数据模型

    K-V、BSon(Binary Json)、列族、图形

    CAP+BASE

    传统ACID:Atomicity、Consistency、Isolation、Durability

    CAP(只能3选2):Consistency(强一致性)、Availability(可用性)、Partition tolerance(分区容错性)

    BASE:Basically Available(基本可用)、Soft state(软状态)、Eventually consistent(最终一致)

    Redis(Remote Dictionary Server)

    特点

    1. 内存存储和持久化

    2. 取最新n个数据的操作

    3. 设定过期时间

    4. 发布、订阅消息系统

    5. 定时器、计数器

    5大数据类型

    string:二进制安全,可以存储jpg图片或序列化对象。一个redis字符串value最大可以是512M

    hash:一个string类型的field和value的映射表,适合用于存储对象,类似于Map<String,Object>

    list:底层是通过链表实现的。可以添加元素至头部或尾部

    set:集合,底层基于hashtable

    zset:sorted set,每个元素都会关联一个double类型的分数,通过分数来进行排序

    常用命令

    key:keys * exsits [key] move [key] [db] expire [key] [seconds] ttl [key] type [key] del[key]

    string:set/get/del/append/strlen incr/decr/incrby/decrby(仅对数字有效) getrange/setrange setex(set with expire) setnx(set if not exist) mset/mget/msetnx get/set

    list:lpush/rpush/lrange(l/r代表left/right) lpop/rpop lindex llen lrem ltrim rpoplpush lset linsert...before/after

    set:sadd/smembers/sismember scard srem srandmember spop smove sdiff sinter sunion

    hash:hset/hget/hmset/hmget/hgetakk/hdel hlen hexists hkeys/hvals hincrby/hincrbyfloat hsetnx

    zset:zadd zrange/zrevrange(withscores) zrangebyscore/zrevrangebyscore(使用'('表示开区间,使用limit对结果进行截取) zrem zcard/zcount zrank zscore zrevrank

    Redis的配置文件:redis.conf

    GENERAL(通用):

    1. daemonize(是否后台运行)、pidfile(pid写入的文件路径)

    On Windows, daemonize and pidfile are not supported.

    1. port:6379
    2. tcp-backlog:511(bachlog是一个队列,等于tcp未完成三次握手队列+已完成三次握手队列)
    3. bind:(绑定的主机地址)
    4. timeout:0(超时将关闭client连接,0代表不关闭)
    5. tcp-keepalive:0(进行keepalive检测的时间,0代表不关闭,建议设置为60)
    6. loglevel:notice(警报级别,可取debug、verbose、notice、warning)
    7. databases:16(数据库数量)

    SECURITY(安全):Redis认证默认关闭

    开启认证:

    config set requirepass "[password]"
    

    然后操作前使用下列语句进行权限认证:

    auth [password]
    

    LIMITS(限制)

    maxclients:10000(最大连接数)

    maxmemory:(最大内存,到达最大内存后无法进行写入操作,但可以继续读取)

    maxmemory-policy:noeviction(过期策略,可选项如下)

    volatile-lru -> remove the key with an expire set using an LRU algorithm
    allkeys-lru -> remove any key according to the LRU algorithm
    volatile-random -> remove a random key with an expire set
    allkeys-random -> remove a random key, any key
    volatile-ttl -> remove the key with the nearest expire time (minor TTL)
    noeviction -> don't expire at all, just return an error on write operations

    maxmemory-sample:5(样本数量,越高可以使LRU或TTL越精确,但会增加CPU功耗)

    待续~

  • 相关阅读:
    StringHelper类的代码也写得不错,值得好好学习学习
    开发感慨
    取地址参数的方法
    在C#中运用SharpZipLib和unrar进行解压缩
    我的模板分析引擎类PHP的.net开发方法功能介绍篇
    分析模板的一段简单快速的算法片段
    关于文件操作的一些感悟
    关于自定义模板的设计
    JS中的函数、Bom、DOM及JS事件 pixel
    什么是CSS盒模型及利用CSS对HTML元素进行定位的实现(含h5/css3新增属性) pixel
  • 原文地址:https://www.cnblogs.com/2511zzZ/p/13056203.html
Copyright © 2020-2023  润新知