Redis初识

初识Redis

Redis是什么?:
开源、基于键值的存储服务系统、多种数据结构,高性能、功能丰富。

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-server
动态参数启动redis:redis-server –port 6380
配置文件启动:redis-server configPath

生产环境建议选择配置启动,单机多实例配置文件可以用端口区分开

客户端连接:redis-cli -h IP地址 -p 端口号

Redis常用配置:

daemonize:是否是守护进程(yes|no),默认是no,建议使用yes
port:redis对外端口,默认是6379
logfile:Redis系统日志名
dir:redis工作目录,如持久化的文件存放在哪

常用通用命令:

keys *: 遍历所有的key
演示:
keys he*
keys he[h-l]
keys ph?

keys一般不在生产环境使用
热备从节点,scan

dbsize: #计算key的总数; 
exists key:检查一个key是否存在
del key [key] #删除指定的key-value
expire key seconds#key在seconds秒后过期
ttl key #查看key剩余的过期时间  (-1代码key存在,且没有过期时间;-2代表key已经不存在了)
persist key #出掉key的过期时间
type key #返回key的类型

数据类型:

字符串String

key-value结构
最大值不能超过512M(但是建议在100K内)

场景:缓存、计数器、分布式锁等等

命令:get,set,del

get key#获取key对应的value
set key value #设置key-value
del key #删除key-value

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)
decrby key k#key自减k,如果key不存在,自减后get(key)=-k O(1)

set key value #不管key是否存在,都设置
stenx key value #key不存在,才设置(添加操作)
set key value xx #key存在,才设置(更新操作)


mget key1 key2 key3...#批量获取key  原子操作
mset key1 value1 key2 value2 key3 value3... #批量设置key-value

因为网络传输原因,使用megt/mset比多次使用get/set要快

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对应的值3.5
getrange key start end #获取字符串指定下标所有的值
setrange key index value #设置指定下标所有对应的值

哈希Hash:

key field value:

可看做一个key对应表的一行

特点:
Mapmap? Small redis
field不能相同,value可以相同

重要API:(皆以H开头)

hget key field #获取hash key对应的field的value
hset key field value #设置hash key对应field的value
hdel key field #删除hash key 对应field的value
以上皆O(1)

hexist key field #判断hash key是否有field
hlen key #获取hash key field的数量

hmget key fidld1 field2 ... #批量获取hash、key的一批field对应的值
hmset key field1 value1 field2 value2...#批量设置hash key的一批field value

hincrby userinfo pageview count;

hgetall key #返回hash key对应所有的field和value
hvals key #返回hash key对应所有的field的value
hkeys key #返回hash key对应所有的field
以上皆是O(n)

hgetall key单线程原因,慎用。

用户信息存储,字符串与hash对比:
string实现v1 :
用户信息stringV1

每次需要序列化或者反序列化
string实现v2:
用户信息stringv2
麻烦

hash实现:
用户信息hash

三种方案比较:
三种方案比较

查缺补漏:

hsetnx key field value #设置hash key对应的field的value(如field已经存在,则失败)
hincrby key field intCounter #hash key 对应的field的value自增intCounter
hincrbyfloat key field value #hincrby浮点数版
以上皆为O(1)

列表(List):

有序,可以重复,左右两边插入弹出。

API(皆以l开头):

rpush key value1 value2... #从列表右端插入值(1-N个)
lpush key value1 value2...#从列表左端插入值(1-N个)

linsert key before|after value newValue #在list指定的值前|后插入newValue;

lpop key #从左边弹出一个item O(1)
rpop key #从列表右侧弹出一个item O(1)

lrem key count value #根据count,从列表中删除所有value相等的项 O(n)
1,count>0,从左到右,删除count个value相等的项
2,count<0,从右到左,删除最多Math.abs(count)个value相等的项
3,count=0,删除所以value相等的项

ltrim key start end; #反正索引范围修剪列表 O(n)
lrang key start end(包含end) #获取列表指定索引范围所有item
lindex key index #获取列表指定索引的item
llen key #获取列表长度


lset key index newValue #设置列表指定索引值为newValue

blpop key timeout #lpop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞。 O(1)
brpop key timeout #rpop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞。 O(1)

集合Set:

无序,无重复,支持集合间操作。

API(S开头):

sadd key element #向集合key添加element(如果element已经存在,添加失败)
srem key element #将集合key中的element移除掉


scard user:1:follow=4 #计算集合大小
sismember user:1:follow it=1(存在) #判断it是否在集合中
srandmember user:1:follow count=his #从集合中随机挑出count个元素
spop user:1:follow=sports #从集合中随机弹出一个元素
smembers user:1:follow=music his sport it#获取集合所有元素

sismember是无序的,要小心使用(如果集合非常大的话)

spop srandmember区别,spop从集合弹出,srandmember区别不会破坏集合

场景:抽奖系统、Like-赞-踩系统、标签(给用户添加标签、给标签添加用户)

查缺补漏:

sdiff key1 key2 =value #差集
sinter key1 key2=value #交集
sunion key1 key2 =value #并集
sdiff|sinter|suion+store... #将交集、差集、并集结果保存在destkey中

有序集合Sorted Set:

VS集合:
此处输入图片的描述

VS列表:
此处输入图片的描述

API:

zadd key score element(可以是多对) #添加score和element O(logN)
zrem key element (可以是多个) #删除元素 O(1)
zscore key element #返回元素的分数
zincrby key increScore element #增加或减少元素的分数
zcard key #返回元素的总个数

zrange key start end[WITHSCORES] #返回指定索引范围内的升序元素[分值]
zcount key minScore maxScore #返回有序集合内在指定分数范围内个数
zremrangbyrank key start end #删除指定排名内的升序元素
zremrangbyscore key minScore maxScore #删除指定分数内的升序元素

场景:排行榜

总结:
此处输入图片的描述

查缺补漏:
zrevrank
zrevrange
zrevrangebyscore
zinterstore
zunionstore