zoukankan      html  css  js  c++  java
  • 数据库--Redis

    Redis是C语言编写的、非关系型(NoSQL)键值数据库,可以存储键和五种不同类型值之间的映射。键类型为字符串,值的类型可以为:字符串STRING、列表LIST、集合SET、散列表HASH、有序集合ZSET。

    与传统数据库不同的是Redis的数据是存在内存中的,因此读写的速度非常快,所以Redis被广泛应用于缓存方向。每秒可以处理超10万次读写操作,是已知性能最快的键值数据库,而且Redis还常用来做分布式锁。除此之外,Redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。

    STRING

    set key_name value;  //向键为key_name加入值value

    get key_name;//查询key_name的值

    del key_name;//删除名称为key_name的键值对

    LIST(允许值重复)

    rpush key_name value;//向键为key_name加入值value

    lrange key_name 0 -1 查询键为key_name的所有值

    lindex key_name x;//查询键为key_name的第x+1条目的值

    lpop key_name;//移出键为key_name对应的链表头

    SET(值不允许重复)

    sadd key_name value;//向键为key_name加入值value

    smembers key_name;//查询键为key_name的所有值

    sismember key_name value;//查询数据库中是否有键为key_name,值为value的条目

    srem key_name value;//删除键为key_name,值为value的条目

    HASH(值不允许重复)

    hset key_name sub_key value;//加入键为key_name,子键为sub_key,值为value的条目

    hgetall key_name;//查询键为key_name中所有的条目

    hdel key_name sub_key;//删除键为key_name,子键为sub_key的所有条目

    hget key_name sub_key;//得到键为key_name,子键为sub_key的值

    ZSET(不允许值重复)

    zadd key_name value;//向键为key_name加入值value

    zrem key_name value;//删除键为key_name,值为value的条目

    list可以有重复的值,set、ZSET不能有重复的值。

    Hash的值和键有关系,键不相同

    Redis有很多特性:

    1、将内存中的数据持久化到硬盘中;

    2、使用复制来扩展读性能;

    3、使用分片来扩展写功能。

    Redis优缺点:

    优点:

    1)读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。
    2)支持数据持久化,支持AOF和RDB两种持久化方式。
    3)支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
    4)数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
    5)支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。

    缺点:

    1)数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

    2)Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。

    3)主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。

    4)Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

    Redis是内存型数据库,这是为了保证数据在断电后不会丢失,需要将内存中的数据持久化到硬盘上。它主要有RDB、AOF两种持久化。

    RDB:将某个时间点的所有数据都存放到硬盘上。可以将快照复制到其他服务器,从而创建具有相同数据的服务器副本。如果系统发生故障,将会丢失最后一次创建快照之后的数据。如果数据量大,保存快照的时间会很长。

    注:快照:将内存中的数据不断写入磁盘。

    redis的数据结构

    字典(dict)

    哈希表(dictht)是一个散列结构,使用拉链法解决冲突

    Redis的字典(dict)中有两个哈希表,这是为了方便进行rehash操作。在扩容的时候,将其中一个哈希表的键值对rehash到另一个哈希表上面,之后再释放空间并交换两个哈希表的角色。

    注:rehash操作不是一次完成的,而是渐进的方式,这是为了防止一次过多的rehash操作给服务器带来过大的负担。

    渐进式rehash通过记录字典(dict)的 rehashidx 完成,它从 0 开始,然后每执行一次 rehash 都会递增。例如在一次 rehash 中,要把 dict[0] rehash 到 dict[1],这一次会把 dict[0] 上 table[rehashidx] 的键值对 rehash 到 dict[1] 上,dict[0] 的 table[rehashidx] 指向 null,并令 rehashidx++。在 rehash 期间,每次对字典执行添加、删除、查找或者更新操作时,都会执行一次渐进式 rehash。采用渐进式 rehash 会导致字典中的数据分散在两个哈希表上,因此对字典的查找操作也需要到对应的哈希表去执行。

    跳跃表

    是有序集合的底层实现之一。跳跃表是基于多指针有序链表实现的,可以看成多个有序链表。在查找时,从上层指针开始查找,找到对应的区间之后再到下一层去查找。

    与红黑树相比:跳跃表:

    1.插入速度快,因为不需要进行旋转操作来维护平衡

    2.更容易实现

    3.支持无锁操作

    redis的使用场景

    计数器:可以对String进行自增自减运算,从而实现计数器功能。Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。

    缓存:将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。

    原文链接:https://thinkwon.blog.csdn.net/article/details/103522351

  • 相关阅读:
    Java面试题集(七)--Spring常见面试问题【重要】
    Java面试题集(六)
    qt4.8.4安装以及64位程序编译方法
    页面跳转动画设置方法
    Lua环境配置 windows + VS
    Oracle触发器(trigger):view,schema,database
    java课程设计(计算器)
    数据结构 练习 19-活动选择问题的实现(动态规划 和 贪心)
    网页在Safari快速滚动和回弹的原理: -webkit-overflow-scrolling : touch;的实现
    如何打开Nib文件
  • 原文地址:https://www.cnblogs.com/lovema1210/p/14540344.html
Copyright © 2011-2022 走看看