redis入门(整理)

2020-04-22  本文已影响0人  薛之谦chj

Redis简介

哪些公司在使用Redis?

github  twitter  stackoverflow   albaba baidu  weibo  等等公司

redis的特性

1.速度快

2.持久化

3.多种数据结构

4.多种编辑语言

5.功能丰富

6.简单

7.主从复制

8.高可用,分布式

特性1 -速度快

数据存在内存,用c语言写的 5000行代码写的,单线程,

速度快慢 register>L1cache>L2cache>main menory>local Disk>Remote Disk

特性2 - 持久化(断电不丢数据)

redis将数据保存在内存种,对数据的更新将异步的保存在磁盘上

特性3 -数据结构

1.string/bitmaps/Blobs  2.hash tables 3.linkedLists  4. set   5.sroted Sets

还有新的数据结构:

bitMaps : 位图  本质  String

HyperLogLog: 嘲笑内存唯一值 计数  本质  String

GEO :地理信息定位  本质 

特性4 -支持多种客户端语言

java  php ruby  lua  python node.js 等等

特性5 -功能丰富

发布订阅  lua脚本  事务功能  pipeline 等等

特性6 -“简单”

23000行 c语言组成    不依赖外部库    单线程模型

特性7 -主从复制

特性8 -高可用,分布式

高可用 >> redis-Sentinel(v2.8)支持高可用

分布式 >> redis-Cluster(V3.0)支持分布式

Redis 典型应用场景

缓存系统 计数器 消息队列  排行榜   社交网络   实时系统 

redis 三种启动方法

最简启动  配置文件启动  动态参数启动

redis 常用配置 

daemonize   是否是守护进程  no|yes

port               redis 对外端口号  默认端口:6379

logfile            redis系统日志

dir                   redis 工作目录

等等很多配置。。。。

redis 通用命令

1.通用命令   2.数据结构和内部编码  3. 单线程架构

1.通用命令                                                                                                       

keys 命令 一般不再生产环境使用                                                         

keys :遍历所有的key    例如:keys  he* 

dbsize : 计算key的总数

exists key:检查key是否存在   存在返回1  不存在返回0

del key:删除指定的key-value     重复删除返回1 不存在返回0

expire key seconds: key在seconds秒后过期

ttl key: 查看key剩余的过期时间

persist key:  去掉key的过期时间

type: 返回key的类型

时间复杂度

keys          o(n)

dbsize       o(1)

del             o(1)

exists         o(1)

expire         o(1)

type           o(1)

单线程

单线程为什么这么快?

1.纯内存 内存响应速度快  2. 非阻塞IO  3.避免线程切换和竞态消耗

单线程需要注意什么?

1.一次只运行一条命令  2. 拒绝长(慢)命令 3.其实不是单线程


Redis API的使用和理解

redis的数据结构

字符串

字符串类型应用场景: 缓存 计数器 分布式锁 等等。

(get set del) key 命令  incr , decr, incrby,decrby

incr key: key自增1 如果key不存在 自增后 get(key)=1

decr key: key自减1 如果key不存在 自减后 get(key)=-1

incrby key k: key 自增k,如果不存在,自增后get(key)=k

decrby ket k:key自减k 如果key不存在 自减后 get(key)=-k

实现如下功能:

记录网站每个用户个人主页的访问量?

incr userid:pageview(单线程:无竞争)

缓存视频的基本信息(数据源在mysql中)伪代码?

public VideoInfo get(long id){

String redisKey = redisPrefix +id;

VideoInfo videoInfo = redis.get(redisKey);

if(videoInfo == null){

videoInfo = mysql.get(id);

if(videoInfo!==null){

//序列化

redis.set(redisKey.serialize(VideoInfo));

}

return videoInfo;

}

set setnx setxx 命令

set key value: 不管key是否存在,都设置  o(1)

setnx key value:  key不存在,才设置           o(1)

setxx key value: key存在,才设置                o(1)

mget mset 命令

mget key1 key2 key3 :批量获取key,原子操作   o(n)

mset key1 key2 key3: 批量设置 key-value           o(n)

getset append strlen  命令

getset key newvalue : set key newvalue 并返回旧的value    o(1)

append key value: 将value追加到 旧的value上                   o(1)

strlen key: 返回字符串的长度(注意中文)                         o(1)

incrbyfloat getrange setrange 命令

incrbyfloat key 3.5: 增加key对应的值 3.5                               o(1)

getrange key start end:获取字符串指定下标所有的值         o(1)

setrange key index value : 设置指定下标所有的值              o(1)

哈希 hash

哈希键值结构   Mapmap结构   field 不能相同  value 可以相同

key                                   fileld                               value

user:1:info                 name                                 chj               

                                         age                                   21

hget   hset   hdel   命令

hget key field :获取hash key对应的field的value      o(1)

hget key field :设置hash key对应的field的value       o(1)

hget key field :删除hash key对应的field的value       o(1)

hexists   hlen 命令

hexists key field: 普安段hash key是否有field           o(1)

hlen key: 获取hash key field 的数量                      o(1)

hmget hmset 命令

hmget key field1 field ... field:批量获取hash key的一批field对应的值         o(n)

hmset key  field1 field ... field : 批量设置hash key的一批field对应的值       o(n)

列表 list   key-elements

特点:有序 可以重复 左右两边可以插入弹出

重要API:

增: rpush  lpush  linsert  命令

rpush key value1 value2 ... valueN: 从列表右端插入值(1...N)                                O(1~N)

lpush key value1 value2 ... valueN: 从列表左端插入值(1...N)                                O(1~N)

linsert key before|after value newvalue: 在list指定的值前 | 后 插入newvalue             O(N)

删: lpop  rpop  lrem  ltrim 命令

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相等的项             

(1)count =0  删除所有value相等的项

ltrim key start end: 按照索引范围修剪列表  ltrim listkey 1 4  就是删除1 4范围外的项

查: lrange   lindex   llen

lrange key start end(包含end):获取列表指定索引范围所有item                            O(N) 

lindex key index:获取列表指定索引的item                                                                    O(N) 

llen key :获取列表长度                                                                                                  O(1)

改: lset  

lset key index newvalue:设置列表指定索引值为newvalue                                            O(N) 

blpop brpop 命令

blpop key timeout: lpop 阻塞版本,timeout 是阻塞超市时间,timeout = 0 为永远不阻塞       O(1)

brpop key timeout: rpop 阻塞版本,timeout 是阻塞超市时间,timeout = 0 为永远不阻塞      O(1)

TIPS

1.  LRUSH+LPOP=Stack                           栈

2.  LPUSH+RPOP - Queue                        队列

3.  LPUSH+LTRIM = Capped Collection    固定数量列表

4.  LPUSH+BRPOP=MEssage Queue       消息队列

set 集合

特点:无序 无重复 集合间操作

集合内API:sadd srem  scard   sismember  srandmember smembers

sadd key element:  向集合key添加element(如果element已经存在,添加失败)            O(1)

srem key element : 将集合key中的element 移除掉                                                         O(1)

scard user:1 follow = 4 :计算集合大小

sismember user:1 follow it = 1(存在) :判断it是否在集合中

srandmember user:1:follow count = his : 从集合中随机挑count个元素

smembers user:1:follow = music his sports it : 获取集合所有元素

smember :  无序  小心使用

srandmember 和spop:spop从集合弹出  srandmember不会破坏集合数据的 而且从集合中随机返回多个元素

set集合 实战-抽奖系统  赞  踩 等  

集合见的API : sdiff sinter sunion

sdiff user:1:follow user:2follow = music his 差集

sinter user:1:follow user:2follow = it sports 交集

sunion user:1:follow user:2follow = it music his sports news ent 并集

sdiff | sinter | sunion + store destkey   将差集 交集 并集 结果保存在destkey中

集合见的实战:  例如 共同关注 

tips:

SADD = tagging  标签相关

SPOP/SRANDMENBER = Random item  随机数

SADD+SINTER = Social Graph 社交相关的


Zset 有序集合

 结构:  key         (score value)

特点: 无重复元素  有序  element+score

重要API: zadd  zrem zscore  zincrby zcard  zrank zrange  zrangebyscore  zcount   zremrangebyrank

zremrangebyscore

zadd key score element (可以是多对): 添加 score (可重复的)和element (不可重复的)                      O(logN)

zrem key element(可以是多个) : 删除元素                                                                                                 O(1)

zscore key element :返回元素的分数                                                                                                            O(1)

zincrby key increScore element:增加或减少元素的分数  zincrby user:1:ranking 9 chj (chj增加9分)O(1)

zcard key :返回元素的总个数                                                                                                                      O(1)

zrank key element :获得排名                                                                                                                       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)

实战--排行榜 

查缺补漏

zrevrank :指定元素的从高到低排名

zrevrange : 从高到低排名 取一定范围

zrevrangebyscore :给定一个分数 获取从高到低的结果

zinterstore :交集

zunionstore : 并集

有序集合总结

基本范围: zadd zrem zcard zincrby zscore

范围操作: zrange zrangebyscore zcount zremrangebyrank

集合操作: zunionstore zinterstore


学习总结:通过慕课网学习 并总结!

可参考这个博主,这个博主总结的很详细:https://www.jianshu.com/p/bd0c2dc95a17

上一篇 下一篇

猜你喜欢

热点阅读