redis入门指南

redis中文官网

https://www.redis.net.cn/
http://www.redis.cn/documentation.html
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。

Redis命令整理

http://doc.redisfans.com/index.html

为什么是Redis

https://www.cnblogs.com/jebysun/p/9417699.html

速度快,完全基于内存,使用C语言实现,网络层使用epoll解决高并发问题,单线程模型避免了不必要的上下文切换及竞争条件;

注意:单线程仅仅是说在网络请求这一模块上用一个线程处理客户端的请求,像持久化它就会重开一个线程/进程去进行处理

丰富的数据类型,Redis有8种数据类型,当然常用的主要是 String、Hash、List、Set、 SortSet 这5种类型,他们都是基于键值的方式组织数据。每一种数据类型提供了非常丰富的操作命令,可以满足绝大部分需求,如果有特殊需求还能自己通过 lua 脚本自己创建新的命令(具备原子性);

除了提供的丰富的数据类型,Redis还提供了像慢查询分析、性能测试、Pipeline、事务、Lua自定义命令、Bitmaps、HyperLogLog、发布/订阅、Geo等个性化功能。

Redis的代码开源在GitHub,代码非常简单优雅,任何人都能够吃透它的源码;它的编译安装也是非常的简单,没有任何的系统依赖;有非常活跃的社区,各种客户端的语言支持也是非常完善。另外它还支持事务(没用过)、持久化、主从复制让高可用、分布式成为可能。

epoll的发展历程

1.多线程BIO
多个线程和内核交互。问题:socket发生阻塞

2.同步非阻塞NIO
单线程在用户空间轮询。问题:多个请求又多次轮询,造成内核压力

3.多路复用
用户态一次将所有的请求发给内核的系统调用select,内核监控又返回就返回给用户,用户再次调用read读取。问题:返回再读取数据发来发去比较繁琐浪费

4.共享空间
内核和用户之间开辟一块共享空间存储需要交互的数据(mmap将一个文件或者其它对象映射进内存)

零拷贝

sendfile函数在两个文件描述符之间传递数据(完全在内核中操作),从而避免了内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,被称为零拷贝。

1、系统调用 sendfile() 通过 DMA 把硬盘数据拷贝到 kernel buffer,然后数据被 kernel 直接拷贝到另外一个与 socket 相关的 kernel buffer。这里没有 用户态和核心态 之间的切换,在内核中直接完成了从一个 buffer 到另一个 buffer 的拷贝。
2、DMA 把数据从 kernel buffer 直接拷贝给协议栈,没有切换,也不需要数据从用户态和核心态,因为数据就在 kernel 里。

二进制安全

Redis用字节流按位进行存储的。存储的客户端和读取的客户端只要编码格式一致,就能读取到一致的数据。没有乱码问题。
识别中文

redis-cli --raw

客户端访问带--raw(使用扩展编码集)可以识别出中文。UTF-8编码中文是3个字节,GBK编码中文是2个字节。

key值

key值里面存储了Value的数据类型type,可以用type命令查看value的数据类型。
存储encoding。用OBJECT encoding [key] 命令查看。可以在string类型中识别出int,raw。编码会随着操作更新,但是不改变存储。

存储这两个值可以在执行方法的时候省去判断,直接执行或者报错。细节提速!

正反向索引

有一个字符串“hel”,正向索引是0,1,2,反向索引是-1,-2,-3。Redis支持正反向索引

原文地址:https://www.cnblogs.com/farmersun/p/12693966.html