特点
- 数据结构
- key-value
- Java Map : String value = map.get(“key”)
- Python Dict : dictionary[“key “] value
- PHP Array:[‘key’ => ‘value’]
- ……
- 其他
- BitMaps 位图 布隆过滤器
- HyperLoglog 超小内存唯一值计数
- GEO 地理信息定位
- key-value
- 速度快
- 10w OPS 即operation per second 每秒操作次数。意味着每秒对Redis的持久化操作
- 数据存储在内存
- C语言编写
- 单线程
- 持久化
- 内存(数据) -> 异步 硬盘 RDB AOF
- 高可用 Redis-Sentinel(v2.8)
- 分布式 Redis-Cluster(v3.0)
- 主从复制
- 高可用分布式
- 功能丰富
- 发布订阅
- 事务
- Lua脚本
- pipeline
- simple
- 23000 lines of core code
- 不依赖外部库(like libevent)
- 单线程模型
典型应用场景
- 缓存系统
- 计数器
- 消息队列系统 发布订阅
- 排行榜
- 社交网络
- 实时系统
- 布隆过滤器
安装
$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz
$ tar xzf redis-2.8.17.tar.gz
$ cd redis-2.8.17
$ make && make install
- redis-server
- Redis服务器
- redis-cli
- Redis命令行客户端
- redis-benchmark
- 性能测试
- redis-check-aof
- AOF文件修复工具
- redis-check-dump
- RDB文件检查工具
- redis-sentine
- sentinel服务器(2.8以后)
启动方式
$ cd src
# 最简启动
$ ./redis-server
# 动态参数启动
redis-server --port 6379
# 配置文件启动
redis-server 配置文件
# 验证方式
ps -ef | grep redis
netstat -antpl |grep redis
redis-cli -h ip -p port ping
- 生成环境选择配置启动
- 单机多实例配置文件可以用端口区分开
客户端连接
[@zw-34-55~]#redis-cli-h 10.10.79.150-p 6384
10.10.79.150:6384>ping
PONG
10.10.79.150:6384>set hello world
OK
10.10.79.150:6384>get hello
hello
- 状态回复
- ping
- 错误回复
- 整数回复
- incr
- 字符串回复
- get
- 多行字符串回复
- mget
命令配置
- daemonize
- 是否是守护进程(nolyes)
- port
- Redis对外端口号
- logfile
- Redis系统日志
- dir
- Redis工作目录
通用命令
-
key
-
keys*
- 遍历所有key
- keys命令一般不再生产环境使用.过重,o(n)
-
热备从节点
-
scan 用于迭代当前数据库中的数据库键
-
del key [key…]
- 删除指定key-value
- 时间复杂度 O(1)
-
dbsize
- 计算key的总数
- 时间复杂度 O(1)
-
expire key seconds
- key在seconds秒后过期
- 时间复杂度 O(1)
-
exists key
- 检查key是否存在
- 时间复杂度 O(1)
-
type key
- 返回key的类型 string,hash,list,set,zset,none
- 时间复杂度 O(1)
-
ttl key
- 查看key剩余的过期时间
-
persist key
- 去掉key的过期时间
- 去掉key的过期时间
数据结构和内部编码
单线程为什么这么快?
- 1.纯内存
- 2.非阻塞IO
- 3.避免线程切换和竞态消耗
- 1.一次只运行一条命令
- 2.拒绝长(慢)命令
- keys,flushall,flushdb,slow lua script,mutil/exec,operate ,big value(collection)
- 3.其实不是单线程
- fysnc file descriptor
- close file descriptor
API们
字符串
- 场景
- 缓存
- 分布式锁
- 计数器
字符串键值结构
- get key
- 获取key对应的value
- 时间复杂度 O(1)
- set key value
- 设置key-value
- 时间复杂度 O(1)
- del key
- 删除key-value
- 时间复杂度 O(1)
- incr key
- key自增1,如果key不存在,自增后get(key)=1
- 时间复杂度 O(1)
- decr key
- key自减1,如果key不存在,自减后get(key)=-1
- 时间复杂度 O(1)
- incrby key k
- key自增k,如果key不存在,自增后get(key)=k
- 时间复杂度 O(1)
- decr key k
- key自减k,如果key不存在,自减后get(key)=-k
- 时间复杂度 O(1)
- set key value
- 不管key是否存在,都设置
- 时间复杂度 O(1)
- setnx key value
- key不存在,才设置
- 时间复杂度 O(1)
- set key value xx
- key存在,才设置
- 时间复杂度 O(1)
- mget keyl key2 key3…
- 批量获取key,原子操作
- 时间复杂度 O(n)
- mset key1 valuel key2 value2 key3 value3
- 批量设置key-value
- 时间复杂度 O(n)
- getset key newvalue
- set key newvalue并返回旧的value
- 时间复杂度 O(1)
- append key value
- 将value追加到旧的value
- 时间复杂度 O(1)
- strlen key
- 返回字符串的长度(注意中文)
- 时间复杂度 O(1)
- incrbyfloat key 3.5
- 增加key的value值3.5
- 时间复杂度 O(1)
- getrange key start end
- 获取字符串指定下标所有的值
- 时间复杂度 O(1)
- setrange key index value
- 设置指定下标所有对应的值
- 时间复杂度 O(1)
HASH
- 时间复杂度O(1)
- hget key field
- 获取hash key对应的field的value
- hset key field value
- 设置hash key对应field的value
- hdel key field
- 删除hash key对应field的value
- hexists key field
- 判断hash key是否有field
- 时间复杂度O(n)
- hmget key field1 field2…fieldN
- 批量获取hash key的一批field对应的值
- hmset key field 1 valuel field2 value2…fieldN valueN
- 批量设置hash key的一批field value
- 批量设置hash key的一批field value
- 时间复杂度O(n)
- hgetall key
- 返回hash key对应所有的field和value
- hvals key
- 返回hash key对应所有field的value
- hkeys key
- 返回hash key对应所有field
- 时间复杂度O(1)
- hsetnx key field value
- 设置hash key对应field的value(如field已经存在,则失败)
- hincrby key field intCounter
- hash key对应的field的value自增intCounter
- hincrbyfloat key field floatCounter
- hincrby浮点数版
- hincrby浮点数版
string和hash对比
lists 列表
Set 集合
- 无序
- 无重复
- 集合间操作
- smembers 无序,小心使用(数据过大时)
- 时间复杂度 O(1)
- sadd key element
- 向集合key添加element(如果element已经存在,添加失败)
- srem key element
- 将集合key中的element移除掉
- 将集合key中的element移除掉
集合间操作
- SADD=Tagging
- SPOP/SRANDMEMBER=Random item
- SADD+SINTER =Social Graph
zset 有序集合
- 无重复元素
- 列表 -> 可以有重复元素
- zadd key score element(可以是多对)
- 添加score和element
- O(logN)
- zrem key element(可以是多个)
- 删除元素
- O(1)
- zscore key element
- 返回元素的分数
- O(1)
- zincrby key increScore element
- 增加或减少元素的分数
- O(1)
- zcard key
- 返回元素的总个数
- O(1)
- zrange key start end [WITHSCORES]
- 返回指定索引范围内的升序元素[分值]
- O(log(n)+m)
- zrangebyscore key minScore maxScore [WITHSCORES]
- 返回指定分数范围内的升序元素[分值]
- O(log(n)+m)
- zcount key minScore maxScore
- 返回有序集合内在指定分数范围内的个数
- O(log(n)+m)
- zremrangebyrank key start end
- 删除指定排名内的升序元素
- O(log(n)+m)
- zremrangebyscore key minScore maxScore
- 删除指定分数内的升序元素
- O(log(n)+m)