1、前置知识
磁盘知识:寻址:ms
宽带:G/M
内存:寻址:ns
带宽:很大
秒 > 毫秒 > 微秒 > 纳秒
内存寻址比硬盘寻址快10w倍
折中做法:
将内存种的一部分数据做缓存
memcached
key value结构,value没有类型的概念
redis(秒级十万操作)
同为key value结构,value有类型,string(字符,数值,bitmaps),hashes,lists,sets,sorted sets
2、安装
//下载 wget http://download.redis.io/releases/redis-5.0.5.tar.gz //解压 tar -xf redis-5.0.5.tar.gz //安装 make make install PREDIX=/opt/redis
//修改环境变量
vim /etc/profile
export REDIS_HOME:/opt/redis
export PATH:.$PATH:REDIS_HOME/bin
//安装服务,按脚本填写配置,自动生成脚本文件在/etc/redis/6379
cd utils
./install_server.sh
3、处理流程
linux系统种存在kernel(内核),epoll是一种系统调用,redis是单进程单线程单实例并发很多的请求,为什么并发那么多。调用了系统内核的epoll
epoll概念
文件描述符从block(阻塞)发展到noblock(非阻塞的),这时为同步非阻塞时期
此时发展出一个问题,用户进程轮询调用1000次kernel,成本问题
这时发展出了select概念
统一把这一千个文件描述符传给select,多路复用nio,减少了内核态和用户态的切换
这些所有的功能都是由jvm实现的,jvm由c编写
4、关于linux用户态和内核态(待完善)
问题:文件描述符相关数据拷来拷去成为累赘
内核有内核的空间,用户有用户的空间,所以伸展出一个内核和用户的共享空间
共享空间由红黑树+链表+mmap实现
5、实际操作
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。
Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
String:
select db //选择数据库(0-20) set k v //设置一个数据 set k1 v nx //nx仅仅可以新建的时候进行插入数据 set k2 v xx //xx仅仅可以更新的时候进行更新数据 mset k1 v1 k2 v2 //可以进行设置多个值 get k //返回一个v,没有返回nil mget k1 k2 k3 // 获取多个v getrange k start end //获取一个索引从start到end,双闭合的区间 setrange k start value //更新区间范围,我们可以从start的索引开始,更新value数据 del key //删除一条kv数据 keys pattern //用正则查询key flushdb //清空db help @string //查询string相关帮助信息 append k v //给k的数据进行追加v这个数据 type k //查看value是什么类型 object encoding k //查看v的数据类型 incr k1 //将integer的数据类型加一 incrby k1 v //将integer数据类型加v decr k1 //将integer的数据类型减一 decrby k1 v //将integer数据类型减v incrbyfloat k1 v //将integer数据类型加一个浮点型 //数据不够长的时候编码是embstr,之后会变为raw格式 strlen k1 //查看v的长度 redis-cli --raw //进行进入,会识别编码(比如自动识别GBK) getset k1 v //更新新值,返回旧值 bitpos key bit start //查看从start到end的字节,第一次bit出现的位置 bitcount key start //查看start到end的时候,1出现的次数 bitop and andkey k1 k2 //执行k1 k2 按位与操作 bitop or orkey k1 k2 //按位或操作
list:
//lpush、lpop、rpush、rpop 和栈一样 lrange 0 -1 //所有元素查看 lindex key index //查看索引位置的值 lrem key count value //移除count数量的value linsert key after afval value //在键后面插入值 linsert key before befval value //在key前面插入值 blpop //阻塞式取值(等待有值再取出) ltrim key start //修剪,进行修剪队列
hash:
hset key filed value //设置一个key field的值 hget key field //获得一个key field的值 hmset key field value field value //设置多个field的值 hmget key field fied //获取多个field的值 hkeys key //查看所有的key hvals key //查看所有的field hincrby key field num //增加num值
set:
sadd key v1 v2 v3... //插入v1,v2,v3... smember key// 列出所有的value srem v1 v2 //删除v1,v2... sinter k1 k2 //求交集并返回 sinterstore dest k1 k2 //交集结果存储dest sunion k1 k2 //求并集返回 sunionstore dest k1 k2 //并集存储dest sdiff k1 k2 //求差集并返回 sdiffstore dest k1 k2 //求差集存储dest srandmember k1 //随机返回一个成员 srandmember k1 num //随机返回num个元素,num为正数,取出一个去重结果集,如果为负数,那么取出不去重结果集
zset:
- zadd k score mem score mem //插入数据后增加权重 - zrange k 0 -1 //取出所有的值 - zrangebyscore k low high //取出从low到high区间的数据 - zrange k start end //从start到end之间的数据取出 - zscore k v //返回一个数据的分值 - zscore k v //返回一个数据的排行 - zrange k 0 -1 withscores //携带分数取出 - zincrby k incrscore v //增加一个值的分值 - zunionstore k keynum k1 k2..[aggregate max] //多个key的并集[最大值]