一.常识
- 磁盘
- 寻址: ms毫秒
- 带宽: IO流 G/M
- 内存
- 寻址:ns纳秒 磁盘比内存慢了十万倍
- 带宽:很大
-磁盘和磁道,扇区 一扇区512Byte带来一个成本变大:索引
操作系统,无论你读取多少,都是至少4K从磁盘拿
- 数据库:表很大性能下降?如果表有索引增删改变慢,查询速度 1个或少量依然很快,并发大的时候会受硬盘带宽影响速度。
二.安装
1.https://www.cnblogs.com/Ai-Hen-Jiao-zhi/p/10127731.html
2.yum install wget
3.mkdir soft > wget http:------------------------------------->tar -zxvf
4.cd redis src 看 readme.md
5.make (编译工具)
---yum isstall gcc
---make distclean
- make
- cd redis/src目录下,会生成可执行的程序(redis-server)
8.make install PREFIX=/opt/fengguoxing/redis6(将src中的可执行程序复制到该目录的bin下)
redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server
9.将redis变成服务 (我们不需要每次都去软件的目录下去./server.sh)/etc/profile
export REDIS_HOME=/opt/fengguoxing/redis6
export PATH=$PATH:$REDIS_HOME/bin
source /etc/profile
10.到 redis的utils目录下执行 ./install_server.sh(我们可以反复操作此步骤生成多个实例)
a 一个物理机中可以有多个redis实例(进程) 通过port区分
b可执行程序就一份在目录,但是内存中未来的多个实例需要各自的配置文件,持久目录资源
c service redis_6379 start/stop/status > etc.init.d /etc/init.d目录下有 redis_6389(包含该服务的所有信息)
d脚本还会帮助启动
10 ps -fe | grep redis
root 85990 1 0 13:42 ? 00:00:00 /opt/fengguoxing/redis6/bin/redis-server 127.0.0.1:6379
root 86270 1 0 13:55 ? 00:00:00 /opt/fengguoxing/redis6/bin/redis-server 127.0.0.1:6380
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [/opt/fengguoxing/redis6/bin/redis-server]
三.Redis快的原因:
内核采用多路复用:
1.用户空间create epoll 返回epoll文件描述符,一个连接进来,epoll准备一个共享空间。1000个连接注册到红黑树,如果有数据到了,就会将数据放到链表中,用户空间调用ctl(add delet) wait()等待事件,如果链表中有数据,结束阻塞,取出数据,
三.基础知识
redis有16个库
2.和memcached的比较
三.数据类型介绍
1. string
set k1 hello nx(不存在就创建:分布式)
set k2 xx xx(更新操作)
append k1 "word":对k1进行追加 hello word
setrange k1 6 fgx: hello fgx
type k1 :string
getset k1 ma :返回hello 同时将k1改成ma
msetnx k1 a k2 b(原子操作)
mget k1 k2: a b
1.2 bitmap:字节:一个字节8位>00000000 00000000:很重要
setbit d 1 1 :01000000
setbit d 7 1 :01000001
setbit d 9 1 :01000001 01000000
get d:"A@"
2:bitpos d 1 0 1:(integer) 1
1:我们要找的元素值.
0: 代表开始位置的字节
1:代表开始结束的字节
1:代表整个位图中1第一次出现的位置
3.bitcount(整个位图统计1的次数):
bitcount d 0 1 :(integer) 3
统计0到1个字节中 1在整个位图出现的次数
4.bitop(与或运算):
bitop and andkey k1 k2(有0则为0,全1则为1)
bitop or orkey k1 k2(有1则为1,全0则为0)
需求1:统计用户全年登录天数,其随机窗口
分析:有两个固定的数值 一年的天数,就算按400天来算,一个二进制位代表一天,400/8=50,所以50个字节可以最大限度记录用户的登录天数
setbit feng 1 1
setbit feng 364 1
strlen feng : (integer) 46 (用46个字节记录了该用户全年的登录记录)
需求2:统计用户最后两周登录的天数
bitcount feng -2 -1 : (integer) 1 :最后16天
需求3:JD618做活动,凡是登录就送一份礼物,备货多少,假设有2亿用户(僵尸用户/冷热用户)
分析:比如6号-7号登录次数,去重,位图进行旋转,用户映射到二进制位上
127.0.0.1:6379> setbit 20200606 1 1
(integer) 0
127.0.0.1:6379> setbit 20200607 1 1
(integer) 1
127.0.0.1:6379> setbit 20200607 7 1 :20200607 代表日期,7代表用户 ,1代表登录
(integer) 1
127.0.0.1:6379> bitop or deskkey 20200606 20200607
(integer) 1
127.0.0.1:6379> bitcount deskkey 0 -1
(integer) 2
127.0.0.1:6379>
- list
lpush k1 a b c d e f(从左边放入)
rpush k2 a b c d e f(从右边放入)
lpop k1 : "f"
LRANGE k1 0 -1(正负索引) 0到最后的元素
LINDEX k1 2 : "d"
lpush k3 1 a 2 a 3 a 4 c 5 a 6 d
LREN k3 2(移除两个) a
LINSERT k3 after 6 a
LINSERT k3 before 6 a
3.hash: