【从入门到放弃-Redis】redis基础

redis是开源的,bsd许可,高级的ky-value存储系统。

可以用来存储字符串,哈希结构,链表,集合,因此常用来提供数据结构服务

redis和memcached相比的独特之处:
1:redis可以用来做存储(storage),而memcacahed是来做缓存(cache),
这个特点主要是因为其有“持久化”功能

2.存储的数据有“结构”,对于memcached来说,存储的结构,只有一种类型-
“字符串”,而redis则可以存储字符链表,哈希结构,集合,有序结合

redis安装不用config 直接make就好,注意时间信息
make PREFIX=/usr/local/redis install
安装目录下:
redis-benchmark :性能测试工具
redis-check-aof:检查aof日志的工具
redis-checkdump:检查rdb日志的工具
redis-cli:链接用的客户端
redis-server:链接用的服务进程

redis默认有16个数据库 从0编号 默认在0号数据库操作

通用命令:
keys (pattern) 查询相应的key
在redis里允许模糊查询key
有3个通配符,?,[] :通配任意多个字符
?:通配单个 字符
[]:通配括号内的某一个字符

set key value 设置k-v
randomkey 返回随机的key
exists key 判断有没有该key 返回1有,0没有
type key 判断key的数据类型
del key 删除该key
rename key newkey 给key改名字
renamenx key newkey 如果newkey不存在则改名
move key db 把key移动到db号数据库
select db 选择db号数据库

生命周期:
expire key 整型值 设置key的生命周期为多少秒
pexpire key 整型值 设置key的生命周期为多少毫秒
ttl key 查询key的生命周期 以秒返回生命周期 对不存在的、已过期的和永久有效的都返回-1
pttl key 查询key的生命周期 以毫秒返回生命周期 对不存在的、已过期的和永久有效的都返回-1
persist key 把key设置成永久有效

字符串类型的操作:
set key value [ex 秒数]/[px 毫秒数] [nx]/[xx]
如果ex px同时写,以后面的为准
nx:表示key 不存在时候,执行操作
xx:表示key存在的时候,执行操作(相当于更改)

mset multi set 一次性设置多个键值
如:mset k1 v1 k2 v2 k3 v3…

get key 获取key的value
mget key1 key2 key3… 获取多个key的value

setrange key n value 把key的偏移n位开始设置成value
getrange key start stop 在[start, stop]中获取字符串
append key value 在key后追加value

getset key newvalue 获取到key的值并把value设置成newvalue

incr key key加一
decr key key减一

incrby key 整型值 key增加整型值
decrby key 整型值 key减去整型值

incrbyfloat key 浮点数 key增加浮点数

setbit keyoffset value 设置offset对应的二进制位上的值,返回该位上的旧值
注意:如果offset过大则会在中间填充0
offset最大为2^32-1 可推断出字符串最大为512M

char的大小写转换:
A 65 0100 0001
a 97 0110 0001
所以将第二位的值做改变就ok
setbit char 2 1 变小写
setbit char 2 0 变大写

bitop opreation destkey key1 [key2…] 对多个key进行位操作,结果放在destkey中
operation 有 and、or、not、xor等操作

链表类型的操作:
lpush list value [value2, value3, …] 在list左边插入value
rpush list value [value2, value3, …] 在list右边插入value

lpop list value 把list最左边的元素删除
rpop list value 把list最右边的元素删除

lrange list start end 查看list中[start, stop]的元素
小技巧:lrange list 0 -1 查看list中的所有元素

lrem key count value 从链表中删除value值,删除count的绝对值个value后结束
count>0 从表头开始删
count<0 从表尾开始删

ltrim list start end 截取list中[start, end]的元素作为list的元素

lindex list n 获取list中索引n处的值

llen list 计算list中元素的个数

linsert list after|before search value 在list中寻找search,并在search值之后 | 之前,插入value
注:一旦找到search之后会直接插入,不会插入多个value

rpoplpush source dest 把source的尾部取出来放在dest的头部
场景:task+bak 双链表完成安全队列
业务逻辑:
1:rpoplpush task bak
2:接收返回值,并作业务处理
3:如果成功则rpop bak 清除任务,如果不成功,下次从bak表中取任务

brpop | blpop list timeout 等待弹出list的尾 | 头元素 timeout为等待超时时间 如果timeout为0则一直等待
场景:长轮询Ajax,在线聊天时能用到

redis 应用场景:
1:一亿个用户,用户有频繁登陆的,也有不经常登陆的
2:如何来记录用户的登录信息
3:如何来查询活跃用户,【如一周内连续登陆】

思路:用位图法,使用位来存储,0表示当天未登陆,1表示当天登陆

redis 实现 setbit mon 100000000 0 初始化一亿位的0
setbit mon 1 1 设置1号用户的对应位为1,表示当天已登陆

优点:节省存储空间、计算统计方便

无序集合类型的操作:
集合特点:无序性、确定性、唯一性
注意:string和list可以通过range来访问其中的某几个字符或某几个元素,但因为集合的无序性,无法通过下标或者范围来访问部分元素
因此,想看集合中的元素,要么随机选一个,要么全选

sadd key value1 value2 往集合中添加元素
srem key value1 value2 从集合中删除元素

spop key 随机返回并删除集合key中的一个元素
适合场景:抽签 每次抽出一个元素

srandmember key 随机返回集合key中的一个元素,不删除
smembers key 返回key中所有元素
sismember key value 判断value是否在key中 ,存在返回1,不存在返回0

scard key 返回key中元素的个数

smove source dest vlaue 把source集合中的value移动到dest集合中

sinter key1 key2 key3 返回key1、key2、key3的交集

sunion key1 key2 key3 返回key1、key2、key3的并集

sdiff key1 key2 key3 返回key1、key2、key3的差集

sinterstore dest key1 key2 key3 将key1、key2、key3的交集保存至dest

sunionstore dest key1 key2 key3 将key1、key2、key3的并集保存至dest

sdiffstore dest key1 key2 key3 将key1、key2、key3的差集保存至dest

有序集合类型的操作:
zadd key score1 value1 score2 value2 …
添加有序链表至key,score为权重,系统会根据score自动排序

zrange key start stop [withscores]
把集合排序后,返回名次[start,stop]的元素,默认是升序排列,withscores把score打印出来

zrangebyscore key min max [withscores] limit offset N
集合(升序)排序后,取出score在[min, max]内的元素,
并跳过offset个,取出N个

zrank key value 返回value在key中的位置

zremrangebyrank key start end 按照排名删除元素,删除名次在[start, end]之间的

zremrangebyscore key min max 按照score来删除元素,删除score在[min, max]之间的

zrem key value 删除key中值为value的元素

zcard key 返回key中元素的个数

zcount key min max 返回在区间[min, max]中的元素的个数

zinterstore|zunionstore dest numkeys key1 [key2…]
[WEIGHTS weight1 [weight2…] ]
[AGGREGATE SUM|MIN|MAX]
求key1 key2的交|并集,key1 key2的权重分别为weight1 weight2
聚合方法用:sum|min|max
聚合结果,保存在dest集合内

注意:weights,aggregate 如何理解?
答:如果有交集,交集元素又有score,score如何处理
aggregate sum->score相加,min求最小score,max求最大score
另:可以通过weight设置不同key的权重,交集时,score*weights

Hash类型的操作:
hset key field value 设置key下字段field的值为value
hmset key field1 value1 [field2 value2 …] 设置多个键值对

hget key field 返回key中field域的值
hmget key field1 field2 field3… 返回key中field1 filed2 field3…的值

hgetall key 返回key中,所有域与其值

hdel key field 删除key中field域

hlen key 返回key中元素的数量

hexists key field 判断key中有没有field域

hincrby key field value 把key中的field域的值增长整型值value
hincrbyfloat key field value 把key中的field域的值增长浮点型值value

hkeys key 返回key中所有的filed
hvals key 返回key中所有的value