一,单进程
- redis使用单进程模型来处理客户端的请求,通过epoll函数的包装来得到,Redis的实际处理速度完全依靠主进程的执行效率
- Epoll是Linux内核为处理大批量文件描述符而做了改进的epoll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
二,redis默认16个数据库,从0开始,初始默认使用0号库
- 切换数据库:select 6 即切换第6号库
三,默认端口:6379
四,Redis的五大数据类型
- 字符串(最基本类型)
- string是redis最基本类型,可以包含任何数据,比如JPG图片或者序列化的对象;
- 单个redis字符串value最多可以是512M
- 列表:底层是链表
- 集合:底层是一个无序的哈希散列表
- 哈希:是键值对集合,适用于存储对象
- 有序集合Zset
- 每个元素都会关联一个double类型的分数,redis通过分数为集合中的成员从小到大排序,元素只能唯一,但分数可以重复。
五,三大特点
- 支持数据持久化
- 将内存中的数据保持在磁盘中,重启时可以再次加载进行使用
- 支持多种数据类型进行存储
- 支持数据备份
- master-slave模式的数据备份
六,作用
- 内存存储和持久化
- 取最新N个数据的操作,如:可以将最新的10条评论的id放在Redis的List集合里面
- 模拟类似于HttpSession这种需要设定过期时间的功能
- 发布,订阅消息系统
- 定时器,计数器
七,redis基础命令
- 常用命令大全:http://redisdoc.com/
- 启动:redis-server /myredis/redis.conf
- 连接redis:redis-cli -p 6379
- 设置和查看数据:set k1 hello ,get k1 如果设置相同的key 则覆盖之前的
- 退出:SHUTDOWN
- 切换数据库:select eg:select 7 查看第8个库
- 查看当前数据库key的数量:dbsize
- 清空当前库:flushdb
- 清空所有16个数据库:flushall
10.config get dir 查看redis启动路径即可找到启动的日志 - key的常用命令
- keys * 查看所有key
- get key的名字 查看某个key的值
- keys k? 类似数据库模糊查询---->k1,k2,k3
- exit key的名字,判断某个key是否存在
- move k3 2 将k3移到2号库
- expire key秒钟 给某个key设置过期时间
- ttl key 查看还有多少秒过期,-1永不过期,-2表示已经过期
- type key 查看key是什么类型
- 字符串的常用命令
- set/del/append/get/strlen key的名字
- incr/decr key的名字 数字的加减点一次加或者减一
- incrby/decrby key的名字 ”数字“ 某个键每次由”数字“来加减
- getrange key的名 0 3 通过下标做范围查看范围内的值,获取指定区间范围内的值,类似between…and (从0到-1表示全部)
- setrange key的名字 索引 新值 给具体索引位置设置新值 eg:从下标为0的位置开始设置:setrange k1 0 xxx —>xxxfs32131
- setex(set with expire)key的名字 秒值 值 给键设置过期时间
- setnx(set if not exit)即:setnx k1 newvalue:如果key1不存在才添加新值
- mset/mget/msetnx k1 v1 k2 v2 批量创建,查找键和值
- 注意:msetnx 批量设置键值 有的键已经存在则命令执行失败
- 列表常用命令
- lpush/rpush key的名字 v1 v2 v3 eg:lpush mylist v1 v2 v3
- lpush是栈,rpush是队列
- lrange key的名字 区间 查看区间范围内的值 eg:LRANGE mylist 0 -1
- lpop key的名字 删除栈顶元素 rpop key的名字 删除栈低元素
- index key的名字 索引 根据索引取key中的值
- llen key的名字 查看key的长度
- lrem key 删除的个数 删除的元素 删除n个 指定相同的元素
- ltrim key 下标(比如0 3)截取0到3的数值重新赋值给key
- rpoplpush key1 key2 将key1 栈低元素移动到key2的栈顶
- lset key的名 index value 将列表中指定下标位置设置新值
- linsert key的名 before/after 指定值 新值 将新值插入到指定值的前后
- lpush/rpush key的名字 v1 v2 v3 eg:lpush mylist v1 v2 v3
- Set常用命令
- sadd key的名字 多个值 添加
- smembers key的名字 查看某个key的所有值
- sismember key的名字 某个值 查看某个值是否在这个key里,在就返回1 不在就返回0
- scard key的名字 获取集合中元素的个数
- srem key的名字 value 删除key中的某个值
- srandmember key的名字 任意整数 从key中随机抽出任意整数个元素
- spop key的名字 随机删除一个元素
- smove key1 key2 key1中的某个值 将key1的某个值移到key2中
- 交并补集命令
- 交集:sinter set01 set02 查出两个集合的交集
- 并集:sunion set01 set02 查出两个集合的并集
- 差集:sdiff set01 set02 显示set01里set02没有的元素
- 哈希常用命令
- 注意:哈希的KV模式不变,但V是一个键值对相当于{key1:{value:1111}}
- hset 创建哈希值:hset user id 11
- hget 获取数值:hget user id
- hmset 批量创建value值:hmset student id 11 name zs age 32
- hmget 批量获取value值:hmget student id name age
- hgetall 哈希里获取所有值:hmget student
- hdel 删除元素:hdel student age
- hlen 查看值的个数:hlen student
- hexists key 某个值 查看某个值是否在key里:hexits student id
- hkeys/hvals 查看哈希里value有哪些键/值:hkeys student/hvals student
- hincrby student age 2 指定int由2递增
- hincrbyfloat student score 0.5 学生的分数由0.5浮点数递增
- hsetnx 添加没有的值:hsetnx student email asds@qq.com
- 有序集合常用命令
- zadd key1 score(分数) :zset01 50 v1 60 v2 20 v3
- zrange key 查看的下标区间 (withscores会携带分数) 查看规定区间的元素:zrange zset01 0 -1 withscores
- zrangebyscore key 开始分数 结束分数 根据分数区间显示对应的值:zrangebyscore zset01 50 90
- 如果有(则表示不包含
- limit 截取:zrangebyscore zset01 60 90 limit 2 2 意思是从第2个往后截取两个也就是取第4,5,个
- zrem key score对应的value 删除元素:zrem zset01 v5
- zcard key ???
- zcount key 分数区间 分数区间的元素个数:zcount zset01 50 90
- zrank key value值 获取值的下标位置:zrank zset01 v4 就会返回下标位置
- zrevrank key 下标区间0 -1 显示元素倒序排
- zrevrangebyscore zset01 90(结束分数) 60(开始分数) 查询分数区间翻转了
17 命令的时间复杂度