Redis应用与原理(1) Redis五种数据结构

面试重点, 需要阅读面经问题。

Redis

关系型数据库。内存缓存数据库。

Redis数据结构

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

String

等价于java中的map, 键值对. 通过set和get命令存取.

redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

redis 127.0.0.1:6379> SET name "runoob"
OK
redis 127.0.0.1:6379> GET name
"runoob"

Redis在string类型上会消耗较多内存,可以使用dict(hash表)压缩存储以降低内存耗用。

Hash

哈希表。在String的基础上再加上一层: 一个hash可以存多个String键值对( hash 是一个键值(key=>value)对集合。). get方法指定hash 和键值对名.

Redis在string类型上会消耗较多内存,可以使用dict(hash表)压缩存储以降低内存耗用。

redis> HMSET myhash field1 "Hello" field2 "World"//myhash为一个hash数据结构, 其中存储有两个键值对.
redis> HGET myhash field1
"Hello"
redis> HGET myhash field2
"World"
redis> HKEYS myhash//列出所有键
redis> HVALS myhash// 列出所有值
redis> HGETALL myhash //会依次列出每个键和它所对应的值
redis> HDEL myhash field1 //从哈希表中删除指定的键值对。
应用
存储、读取、修改用户属性
List

双向链表(不是键值对, 按照插入顺序编号). 头尾都可以添加元素.

redis 127.0.0.1:6379> lpush runoob redis
redis 127.0.0.1:6379> lpush runoob mongodb
redis 127.0.0.1:6379> lpush runoob rabitmq
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"

runoob是一个list, 前三行使用lpush命令把三个元素插入到队列, 第四行列出runoob队列中的前0-10编号的元素.

应用
1.微博 TimeLine
2.消息队列
Set集合

集合. 无视重复添加的字符串.

sadd set num1
sadd set num2
sadd set num2
smembers set
"num1"
"num2"

set为一个集合.

ZSet–Sorted Set有序集合

sorted set 有序集合. Sorted Sets是将 Set 中的元素增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列。

一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。另外还可以用 Sorted Sets 来做带权重的队列,比如普通消息的 score 为1,重要消息的 score 为2,然后工作线程可以选择按 score 的倒序来获取工作任务。让重要的任务优先执行。

1.带有权重的元素,比如一个游戏的用户得分排行榜
2.比较复杂的数据结构,一般用到的场景不算太多?
Java模块Jedis的使用
import redis.clients.jedis.Jedis;
import java.util.List;

public class test{
    public static void main(String[] args){
        Jedis jedis=new Jedis("localhost");
        jedis.set("hi","hello");
        System.out.println(jedis.get("hi"));

        jedis.lpush("list1","run");
        jedis.lpush("list1","away");
        jedis.lpush("list1","now");
        List<String> list=jedis.lrange("list1",0,5);
        for(String i:list)
            System.out.println("List: "+i);
    }
}

Jedis使用教程

jedis连接池

这里的连接池跟Hibernate中的C3P0类似,针对同“一个”数据库可以建立多个连接,Jedis从JedisPool中获取的仅仅是一个连接

Redis 是基于内存的数据库,使用之前需要建立连接,建立断开连接需要消耗大量的时间。

使用连接池可以实现在客户端建立多个连接,需要的时候从连接池拿过来,用完了再放回去。这样就节省了建立、断开连接所消耗的时间。

redis优缺点

支持多种数据结构, 支持持久化操作。

单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。Redis只能使用单线程,性能受限于CPU性能。redis性能很好,但是这和使用单线程无关,使用单线程是为了简单(单线程就已经够用了,不用考虑多线程复杂的并发问题)注意面试陷阱。

支持简单的事务需求,但业界使用场景很少,并不成熟,既是优点也是缺点。

Mc和Redis都是Key-Value类型,不适合在不同数据集之间建立关系,也不适合进行查询搜索。比如redis的keys pattern这种匹配操作,对redis的性能是灾难。

分布式集群-redis集群模式

Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。

测试可以在单机多进程即可。

数据分片

Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念.

Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,

集群角色有Master和Slave。Master之间分配slots,一共16384个slot。Slave向它指定的Master同步数据,实现备份。当其中的一个Master无法提供服务时,该Master的Slave讲提升为Master,保证集群间slot的完整性。一旦其中的某一个Master和它的Slave都失效,导致了slot不完整,集群失效,这时就需要人工去处理了。

Redis Cluster是一个无中心的结构,每个节点都保存数据和整个集群的状态。每个节点都会保存其它节点的信息,知道其它节点所负责的槽。并且会与其它节点定时的发送心跳信息,能够及时感知集群中异常的节点。

缓存一致性

Redis和DB数据一致性处理

  1. 循环5次的CAS更新
  2. 如果没有更新成功,通过worker去定时扫描出数据库的数据,去和缓存中的数据进行比较,对缓存中的状态不正确的数据进行纠正
缓存详解
  • 本地缓存:指的是在应用中的缓存组件,其最大的优点是应用和cache是在同一个进程内部,请求缓存非常快速,没有过多的网络开销等,在单应用不需要集群支持或者集群情况下各节点无需互相通知的场景下使用本地缓存较合适;同时,它的缺点也是应为缓存跟应用程序耦合,多个应用程序无法直接的共享缓存,各应用或集群的各节点都需要维护自己的单独缓存,对内存是一种浪费。
  • 分布式缓存:指的是与应用分离的缓存组件或服务,其最大的优点是自身就是一个独立的应用,与本地应用隔离,多个应用可直接的共享缓存。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值