redis初识
1. Redis是什么
- 开源
- 基于建值对对存储服务系统
- 多种数据结构
- Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
- 高性能 ,功能丰富
2. Redis的前世今生
Redis的特性
- 速度快
官方给出的 10w OPS
数据存在内存中,读取非常快
用c语言实现的(50000 line)
Redis 线程模型:单线程
- 持久化
Redis所有的数据保存在内存中,对数据的更新将异步地保存在磁盘上
Redis 提供了 RDB,AOF持久化方式
- 多种数据结构
String
Hash
List
Sets
Sorted Sets
-------
Redis 迭代中增加的数据结构
BitMaps : 位图
HyperLogLog :超小内存唯一计数
GEO :地理信息定位
- 支持多种编程语言
- 功能丰富
发布订阅
Lua脚本
事物
pipeline
- "简单"
23000 lines of code
不依赖外部库 (like libevent)
单线程模型
- 主从复制
- 高可用,分布式
高可用 :Redis-Sentinel (v2.8 )支持高可用
分布式 :Redis-Cluster (v3.0 ) 支持分数是
Redis使用场景
- 缓存系统
- 计数器
- 消息队列系统
- 排行榜
- 社交网络
- 实时系统
Redis的安装
可执行文件说明
- redis-server -> Redis 服务器
- redis- cli -> Redis命令行客户端
- redis-benchmark -> Redis性能测试
- redis-check-aof -> AOF修复工具
- redis-check-dump -> RDB文件检查工具
- redis-sentinel -> Sentinel服务器(2.8以后)
Redis常用配置
- daemonize -> 是否是守护进程(no | yes)
- port -> Redis对外端口
- logfileile -> Redis 系统日志
- dir -> Redis工作目录
- RDB config
- AOF config
- slow Log config
- maxMemory等等
数据结构和内部编码
单线程为什么这么快
- 纯内存
- 非阻塞IO
- 避免线程切换和竞争消耗
Redis API的使用和理解
1. 通用命令
keys : 遍历所有key
localhost:6379> keys *
1) "b"
2) "blog:90"
3) "blog:71"
4) "blog:80"
5) "myset"
6) "Back3"
dbsize : db长度
localhost:6379> dbsize
(integer) 21
exisits key : 判断key是否存在
localhost:6379> exists a
(integer) 1
del key :删除key
localhost:6379> del a
(integer) 1
expire key seconds :给key设置过期时间(秒)
localhost:6379> expire a 20
(integer) 1
ttl key :查看key 还有多长时间过期 (注:-1 永不过期,-2不存在)
persist key :去掉key的 过期时间
localhost:6379> ttl a
(integer) -2
localhost:6379> set a b
OK
localhost:6379> expire a 50
(integer) 1
localhost:6379> persist a
(integer) 1
type key :查看key 类型
localhost:6379> type a
string
2. 字符串类型
set 、 get 、 del 操作
localhost:6379> set a b
OK
localhost:6379> get a
"b"
localhost:6379> del a
(integer) 1
incr key 自增1,如果key不存在,自增后 get(key) = 1
decr key 自减1,如果key不存在,自减后get(key) = -1
incrby key k ,如果key不存在,自增后get(key) = k
localhost:6379> incr a
(integer) 4
localhost:6379> incr a
(integer) 5
localhost:6379> incr a
(integer) 6
localhost:6379> decr a
(integer) 5
localhost:6379> decr a
(integer) 4
localhost:6379> incrby a 20
(integer) 24
set key value : 进行覆盖操作,不管key是否存在
setnx key :不存在,才设置
setxx :key 存在,才设置
localhost:6379> set a 1234
OK
localhost:6379> SETNX a 20
(integer) 0
localhost:6379> setnx b 20
(integer) 0
localhost:6379> setnx yxl 20
(integer) 1
localhost:6379> set a b xx
OK
mget key1 key2 key3 : 批量获取key,原子操作
mset key1 value1 key2 value2 : 批量设置key - value
localhost:6379> mget a b
1) "b"
2) "456"
localhost:6379> mset a 200 b 500
OK
getset key newvalue : set key newvalue 并返回旧的value
append key value : 将value 追加到旧到value
strlen key :返回字符串到长度
localhost:6379> getset a a
"200"
localhost:6379> APPEND a bcd
(integer) 4
localhost:6379> get a
"abcd"
localhost:6379> strlen a
(integer) 4
incrbyfloat key 3.5 : 增加key 对应的值3.5
getrange key start end : 获取字符串指定下标的所有值
setrange key index value :设置指定下标新的值
localhost:6379> incrbyfloat max 3.5
"3.5"
localhost:6379> getrange max 0 1
"3."
localhost:6379> setrange max 1 23
(integer) 3
localhost:6379> get max
"323"
- 哈希类型
hget key field : 获取hash key 对应的field 的value
hset key field value : 设置hash key 对应的field 的 value
hdel key fiela
localhost:6379> hget user:1:info age
"23"
localhost:6379> hset user:1:info age 23 sex 男
(integer) 0
localhost:6379> hset user: age 23 sex 男
(integer) 2
localhost:6379> hget user: age
"23"
localhost:6379> hset user: name 1234
(integer) 1
localhost:6379> hgetall user:
1) "age"
2) "23"
3) "sex"
4) "\xe7\x94\xb7"
5) "name"
6) "1234"
localhost:6379> hdel user: age
(integer) 1
hexists : 判断hash key 是否有 field
hlen : 获取 hash key field 的数量
localhost:6379> HGETALL user:
1) "sex"
2) "\xe7\x94\xb7"
3) "name"
4) "1234"
localhost:6379> hexists user: name
(integer) 1
localhost:6379> hlen user:
(integer) 2
hmget : hmget key field1 field 2 ......
hmset : hmset key field1 value1 field2 value2 .....
localhost:6379> hmset user2 age 30 name kaka
OK
localhost:6379> hlen user2
(integer) 2
localhost:6379> hmget user2 age name
1) "30"
2) "kaka"
hgetall :返回hash key 对应所有的field 和 value
hvals :返回hash key 对应所有 field 的value
hkeys :返回hash key 对应所有field
localhost:6379> HGETALL user2
1) "age"
2) "30"
3) "name"
4) "kaka"
localhost:6379> HVALS user2
1) "30"
2) "kaka"
localhost:6379> hkeys user2
1) "age"
2) "name"
- 列表类型
rpush : 从列表右端插入值(1-N个)
lpush : 从列表左端插入值(1-N个)
127.0.0.1:6379> rpush list1 1 2 3
(integer) 6
127.0.0.1:6379> lpush list2 1 2 3
(integer) 3
linsert : 在list 指定的值前|后插入 newValue
127.0.0.1:6379> linsert list2 before 2 1234
(integer) 4
127.0.0.1:6379> linsert list2 after 2 1234
(integer) 5
lpop : 从列表左侧弹出一个item
rpop : 从列表右侧弹出一个item
127.0.0.1:6379> lpop list2
"3"
127.0.0.1:6379> rpop list2
"1"
lrem : 根据count值,从列表中删除所有value相等的项
127.0.0.1:6379> lrem list1 0 1
(integer) 2
ltrim : 按照索引范围修剪列表
lrange :获取列表指定索引范围所有item
OK
127.0.0.1:6379> lrange list2 0 -1
1) "1234"
2) "2"
3) "1234"
lindex : 获取指定列表的item
llen : 获取列表长度
lset : 设置列表指定索引值为newValue
127.0.0.1:6379> LINDEX list1 0
"3"
127.0.0.1:6379> llen list1
(integer) 2
127.0.0.1:6379> lset list1 0 1234
OK
127.0.0.1:6379> lrange list1 0 -1
1) "1234"
2) "3"
- 集合类型
sadd : 向集合key添加element(如果存在就添加失败)
scard : 计算集合大小
sismember : 判断it 是否在集合中
srandmember : 从集合中随机挑count 个元素
spop : 从集合中随机弹出一个元素\
127.0.0.1:6379> sadd set1 1234
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> scard set1
(integer) 1
127.0.0.1:6379> sismember set1 1
(integer) 0
127.0.0.1:6379> sismember set1 1234
(integer) 1
127.0.0.1:6379> SRANDMEMBER set1 2
1) "1234"
2) "7"
127.0.0.1:6379> spop set1 1
1) "6"
-
有序集合类型
zadd : 添加score 和 element
zrem : 删除元素
127.0.0.1:6379> zadd zset 1 1234
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> zrem zset 1234
(integer) 1
zincrby : 增加或减少元素的分数
zcard : 返回元素的总个数
zscore : 返回分数
127.0.0.1:6379> ZINCRBY zset 1 1
"1"
127.0.0.1:6379> zcard zset
(integer) 1
127.0.0.1:6379> zscore zset 1
"1"
zrange : 返回指定索引内升序元素
zrangebyscore : 返回指定分数范围内升序元素
zremrangebyrank : 删除指定排名内升序元素
zremrangebyscore : 删除指定分数内升序元素
127.0.0.1:6379> zadd player 1000 ronaldo 900 messi 800 c-aa
(integer) 3
127.0.0.1:6379> zrange player 0 -1
1) "c-aa"
2) "messi"
3) "ronaldo"
127.0.0.1:6379> zcount player 900 1000
(integer) 2
127.0.0.1:6379> zrangebyscore player 1000 1001
1) "ronaldo"
127.0.0.1:6379>
127.0.0.1:6379> zremrangebyrank player 0 1
(integer) 2
127.0.0.1:6379> zrange player 0 -1
1) "ronaldo"