0%

Redis 和 Memecache 的区别是什么?

1. Redis 不仅仅支持简单的 k/v 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。Memecache 支持简单的数据类型 String
2. Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而 Memecache 把数据全部存在内存之中
3. Memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是 Redis 目前是原生支持 cluster 模式的
4. Memcached 是多线程,非阻塞 IO 复用的网络模型;Redis 使用单线程的多路 IO 复用模型

Redis 常见数据结构以及使用场景分析?

1. String 字符串
   字符串类型是 Redis 最基础的数据结构,首先键都是字符串类型,而且其他几种数据结构都是在字符串类型基础上构建的。
   常用在缓存、计数、共享 Session、限速等。
2. Hash 哈希
   在 Redis 中,哈希类型是指键值本身又是一个键值对结构,形如 value={{field1,value1},...{fieldN,valueN}}。
   哈希可以用来存放用户信息,比如实现购物车。
3. List 列表
   列表(list)类型是用来存储多个有序的字符串。
   可以做简单的消息队列的功能。另外,可以利用 lrange 命令,做基于 Redis 的分页功能,性能极佳,用户体验好。
4. Set 集合
   集合(set)类型也是用来保存多个的字符串元素,但集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。
   利用 Set 的交集、并集、差集等操作,可以计算共同喜好,全部的喜好,自己独有的喜好等功能。
5. Sorted Set 有序集合
   Sorted Set 多了一个权重参数 Score,集合中的元素能够按 Score 进行排列。
   可以做排行榜应用,取 TOP N 操作

除此之外还有 3 个高级数据结构
1. Bitmaps bitmaps 应用于信息状态统计
2. HyperLogLog 应用于基数统计
3. GEO 应用于地理位置计算
阅读全文 »

什么是 Kafka

Apache Kafka 是一款开源的消息引擎系统。

Kafka 消息格式

Kafka 使用的是纯二进制字节序列。

Kafka 支持的消息引擎模型

Kafka 同时支持两种消息引擎模型,点对点模型和发布 / 订阅模型。

Topic 含义

在 Kafka 中,发布订阅的对象是主题(Topic),可以为每个业务、每个应用甚至是每类数据都创建专属的主题。
阅读全文 »

题目描述

翻转栈的所有元素,例如输入栈 {1,2,3,4,5},其中 1 处在栈顶,翻转之后的栈为 {5,4,3,2,1},其中,5 处在栈顶,注意使用递归

解题思路

递归算法不需要考虑中间过程,上一层的递归可以直接使用下一层的递归结果,即假设下一层已经完成了我们的要求就行了,最后只需要考虑最后一层递归退出的条件就行了

阅读全文 »

内存快照:宕机后,Redis如何实现快速恢复?


  • Redis 提供了两个命令来生成 RDB 文件,分别是 save 和 bgsave。
save:在主线程中执行,会导致阻塞;
bgsave:创建一个子进程,专门用于写入 RDB 文件,避免了主线程的阻塞,这也是 Redis RDB 文件生成的默认配置。
  • Redis 就会借助操作系统提供的写时复制技术(Copy-On-Write, COW),在执行快照的同时,正常处理写操作。
阅读全文 »

AOF日志:宕机了,Redis如何避免数据丢失?


  • Redis 的持久化主要有两大机制,即 AOF(Append Only File) 日志和 RDB(Redis DataBase) 快照。
  • AOF 日志是如何实现的?
AOF 日志写后日志,“写后”的意思是 Redis 是先执行命令,把数据写入内存,然后才记录日志。

阅读全文 »

高性能IO模型:为什么单线程Redis能那么快?


  • Redis 单线程的理解
Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写(数据读写)是由一个线程来完成的,
这也是 Redis 对外提供键值存储服务的主要流程。
但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。
  • Redis 为什么用单线程?
多线程编程模式面临共享资源的并发访问控制问题。
并发访问控制一直是多线程开发中的一个难点问题,如果没有精细的设计, 比如说,只是简单地采用一个粗粒度互斥锁,就会出现不理想的结果: 即使增加了线程,大部分线程也在等待获取访问共享资源的互斥锁,并行变串行,系统吞吐率并没有随着线程的增加而增加。
而且,采用多线程开发一般会引入同步原语来保护共享资源的并发访问,这也会降低系统代码的易调试性和可维护性。
为了避免这些问题,Redis 直接采用了单线程模式。
  • 单线程 Redis 为什么那么快?
阅读全文 »

数据结构:快速的 Redis 有哪些慢操作?


  • Redis 表现突出的原因
一方面,这是因为它是内存数据库,所有操作都在内存上完成,内存的访问速度本身就很快。
另一方面,这要归功于它的数据结构。 这是因为,键值对是按一定的数据结构来组织的,操作键值对最终就是对数据结构进行增删改查操作, 所以高效的数据结构是 Redis 快速处理数据的基础。
  • 底层数据结构一共有 6 种,分别是简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。

阅读全文 »

解释

这种写法通俗形式为 [条件为假, 条件为真][判断条件]
在 Python 中,布尔型 True 转变为整数等于 1,False 转变为整数等于 0
所以条件为真时,返回第二个数,条件为假时,返回第一个数

用处

1
2
3
4
if x == 0:
a = -1
else:
a = 1

可以写成这样的形式

1
a = [1, -1][x == 0]