Git Product home page Git Product logo

back-end-practice's People

Contributors

qingzhou729 avatar

Stargazers

 avatar

back-end-practice's Issues

Redis不同数据结构之间的差异及应用场景

Redis 数据类型

Redis支持五种数据类型。

string(字符串),list(列表),set(集合),hash(哈希),及zset(sorted set:有序集合)。

String 字符串

image

简介:

字符串类型是Redis中最为基础的数据存储类型,是一个由字节组成的序列,是标准的key/value,一般来存字符串,整数和浮点数。

特性

可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M。

应用场景:

在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如jpeg图像数据、json对象描述信息等。

List 列表

image
简介:

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部或者尾部。

特点:

1、有序、可以重复。

2、是链表结构,所以向列表两端添加元素的时间复杂度为0(1),增删快。

3、提供了操作某一段元素的API。

应用场景:

1、最新消息排行榜,比如朋友圈的时间线、App内消息通知。

2、消息队列,以完成多程序之间的消息交换。可以用push操作将任务存在list中,然后线程在用pop操作将任务取出进行执行。

Set 集合

image

简介:

Redis 的 Set 是 String 类型的无序集合,和List一样是简单的字符串列表。

特点:

1、无序,不可重复的。

2、为集合提供了求交集、并集、差集等操作。

3、集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

应用场景:

1、共同好友。【取交集】

2、统计访问网站的所有独立ip。【元素不可以重复】

3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐。

Hash 哈希

image

简介:

Redis中的Hash散列可以看成具有String key和String value的map容器,可以将多个key-value存储到一个key中。

特点:

适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值。【Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去】。

应用场景:

存储、读取、修改用户属性。

Sort-Set 有序集合

image

简介:

Redis 有序集合和集合一样也是string类型元素的集合。将Set中的元素增加一个权重参数score,元素按score有序排列。

特点:

1、每个元素都会关联一个double类型的分数,数据插入集合时,已经进行天然排序。

2、有序集合的成员是唯一的,但分数是(score)可以重复的。

3、集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

应用场景:

1、排行榜 。

2、带权重的消息队列。

Redis基本命令

redis keys用法

查找所有符合给定模式 patternkey

1.匹配数据库中所有key
$ KEYS *

2.匹配hello,hallo和hxllo等。
$ KEYS h?llo

3.匹配hllo和heeeeello等。
$ KEYS h*llo

4.匹配hello和hallo,但不匹配hillo。
$ KEYS h[ae]llo

redis String用法

Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下。

1.设置指定key的值(重复给key赋值,value会被新的值覆盖)
$ SET key value

2.获取指定key的值
$ GET key

3.返回key中字符串值的子字符
$ GETRANGE key start end 

4.将给定key的值设为或覆盖为value,并返回key的旧值(old value)
$ GETSET key value

5.同时设置一个或多个key-value对
$ MSET key value [key value ...]

6.获取所有(一个或多个)给定key的值
$ MGET key1 [key2..]

7.只有在key不存在时设置key的值。可以避免误改已经存在的key。
$ SETNX key value

8.同时设置一个或多个key-value对,当且仅当所有给定key都不存在。
$ MSETNX key value [key value ...] 

9.返回key所储存的字符串值的长度。
$ STRLEN key

10.将值value关联到key,并将key的过期时间设为seconds(以秒为单位)。过期后将GET不到key的值。
$ SETEX key seconds value

11.这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
$ PSETEX key milliseconds value

12.将 key 中储存的数字值增一。
$ INCR key

13.将 key 所储存的值加上给定的增量值(increment) 。
$ INCRBY key increment

14.将 key 中储存的数字值减一。
$ DECR key

15.key 所储存的值减去给定的减量值(decrement) 。
$ DECRBY key decrement

16.将key所储存的值(也要是浮点数)加上给定的浮点增量值(increment) 。
$ INCRBYFLOAT key increment

17.如果key已经存在并且是一个字符串,APPEND命令将指定的value追加到该key原来值(value)的末尾。如果没有的话如果SET功能。
$ APPEND key value

18.对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 ?????(不是很懂)
SETBIT key offset value

19.对 key 所储存的字符串值,获取指定偏移量上的位(bit)。???(不是很懂)
GETBIT key offset

20用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。 ????(不是很懂)
SETRANGE key offset value

redis Hash用法

1.将哈希表key中的字段field的值设为value
$HSET key field value 

2.获取存储在哈希表中指定字段filed的值。
$ HGET key field
	
3.同时将多个field-value对设置到哈希表key中
$ HMSET key field1 value1 [field2 value2 ] 

4.获取所有给定字段的值
$ HMGET key field1 [field2] 

5.查看哈希表key的field中,指定的字段field是否存在
$ HEXISTS key field

6.获取哈希表key中字段的数量
$ HLEN key

7.获取哈希表key中所有的field
$ HKEYS key

8.获取哈希表key中所有field对应的value
$ HVALS key

9.获取哈希表key中所有field和对应的value
$ HGETALL key

10.删除存储在哈希表field中指定字段field
$ HDEL key field

11.只有field不存在的时候,才将哈希表key中的字段field的值设为value
$ HSETNX key field value

12.为哈希表key中的指定字段的整数值加上增量increment(increment代表要增加的数字)。
$ HINCRBY key field increment 

13.为哈希表key中的指定字段的浮点数加上增量increment(increment代表要增加的浮点数)。
$ HINCRBYFLOAT key field increment 

14.迭代哈希表中的键值对 ??????(不是很懂)
$ HSCAN key cursor [MATCH pattern] [COUNT count] 

redis List用法

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)数据可以重复。

1.将一个或多个值插入到列表头部
$ LPUSH key value1 [value2] 

2.将一个或多个值插入到列表尾部
$ RPUSH key value1 [value2] 

3.查看列表key(从start到stop坐标)的所有元素 
$ LRANGE key start stop 

4.移出并获取列表的第一个元素
$ LPOP key 

5.移出并获取列表的最后一个元素
$ RPOP key 

6.获取列表长度
$ LLEN key

7.将一个值插入到已存在的列表头部
$ LPUSHX key value 

8.为已存在的列表添加值(尾部)
$ RPUSHX key value 

9.移除列表(list1)的最后一个元素,并将该元素添加到另一个列表(list2)并返回
$ RPOPLPUSH list1 list2 

10.通过索引获取列表中的元素(从0开始)
$ LINDEX key index 

11.移出并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
$ BLPOP key1 [key2] timeout(数值)

12.移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
$ BRPOP key1 [key2] timeout(数值)

13.从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
$ BRPOPLPUSH source destination timeout(数值)

14.在列表的元素前或者后插入元素 ??????(不是很懂)
$ LINSERT key BEFORE|AFTER pivot value 

15.通过索引设置列表元素的值
$ LSET key index value 

16.移除列表元素,移除小于等于count数量的value
$ LREM key count value 

17.对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
$ LTRIM key start stop 

redis Set用法

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

1.向集合添加一个或多个成员
$ SADD key member1 [member2]

2.获取集合的成员数
$SCARD key 

3.返回给定所有集合的交集
$ SINTER key1 [key2] 

4.返回给定所有集合的交集并存储在 destination 中
$ SINTERSTORE destination key1 [key2] 

5.返回给定所有集合的差集 key1 在 key2中的差集,命令顺序很重要
$ SDIFF key1 [key2]

6.返回给定所有集合的差集并存储在 destination 中
$ SDIFFSTORE destination key1 [key2]

7.返回集合中的所有成员
$SMEMBERS key 

8.判断 member 元素是否是集合 key 的成员
$ SISMEMBER key member 

9.将 member 元素从 source 集合移动到 destination 集合
$ SMOVE source destination member 

10.移除并返回集合中的一个随机元素
$ SPOP key 

11.返回集合中一个或多个随机数
$ SRANDMEMBER key [count] 

12.移除集合中一个或多个成员
$ SREM key member1 [member2] 

13.返回所有给定集合的并集
$ SUNION key1 [key2] 

14.所有给定集合的并集存储在 destination 集合中
$ SUNIONSTORE destination key1 [key2] 

15.迭代集合中的元素 ????????(不是很懂)
$ SSCAN key cursor [MATCH pattern] [COUNT count] 

redis sortedSet用法

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

1.向有序集合添加一个或多个成员,或者更新已存在成员的分数。
$ ZADD key score1 member1 [score2 member2] 

2.获取有序集合的成员数。
$ZCARD key 

3.计算在有序集合中指定区间分数的成员数。
$ ZCOUNT key min max 

4.有序集合中对指定成员的分数加上增量 increment
$ ZINCRBY key increment member 

5.返回有序集中,成员的分数值
$ ZSCORE key member 

6.返回有序集合中指定成员的索引
$ ZRANK key member 

7.通过索引区间返回有序集合成指定区间内的成员
$ ZRANGE key start stop [WITHSCORES]

8.移除有序集合中的一个或多个成员
$ ZREM key member [member ...] 

9.返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序。(就是反过来排序的排名)
$ ZREVRANK key member 

10.移除有序集合中给定的排名区间的所有成员
$ ZREMRANGEBYRANK key start stop 

11.移除有序集合中给定的分数区间的所有成员
$ ZREMRANGEBYSCORE key min max 

12.返回有序集中指定区间内的成员,通过索引,分数从高到底
$ ZREVRANGE key start stop [WITHSCORES] 

redis key用法

一些其他命令,可以操作5种数据类型。

1.DEL 命令用于删除已存在的键(5种数据类型都可以被删除)。不存在的 key 会被忽略。
$ DEL key

2.Redis DUMP命令用于序列化给定 key,并返回被序列化的值。如果key 不存在,那么返回nil。
$ DUMP key

3.EXISTS 命令用于检查给定 key 是否存在。
$ EXISTS key

4.Redis Expire 命令用于设置 key 的过期时间(单位为秒)。过期后自动删除。
$ EXPIRE key timeout

5.用于以 UNIX 时间戳(unix timestamp)格式设置 key 的过期时间
$ EXPIREAT key TIME_IN_UNIX_TIMESTAMP

6.以毫秒为单位返回 key 的剩余过期时间。
$ PTTL key

key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以毫秒为单位,返回 key 的剩余生存时间。注意:在 Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1 。

7.TTL 命令以秒为单位返回 key 的剩余过期时间。
$ TTL key

8.Rename 命令用于修改 key 的名称。
$ RENAME OLD_KEY_NAME NEW_KEY_NAME

9.Renamenx 命令用于在新的 key 不存在时修改 key 的名称 。
$ RENAMENX OLD_KEY_NAME NEW_KEY_NAME

10.Type 命令用于返回 key 所储存的值的类型。
$ TYPE key

redis Pub/Sub用法

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

pubsub1

pubsub2

1.创建了订阅频道名为 redisChats
$ SUBSCRIBE redisChat

2.开启个 redis 客户端,然后在同一个频道 redisChat 发布两次消息,订阅者就能接收到消息。
$ PUBLISH redisChat "hello"
$ PUBLISH redisChat "word"

redis管道模式

Redis 管道技术可以在服务端未响应时(正忙),客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。

redis数据持久化

Redis虽然是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失。

Redis 提供了多种不同级别的持久化方式:

1.RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。
2.AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。
3.Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。

redis与其他缓存的差别

image

redis集群模式

还没怎么看懂,参考文章:https://juejin.im/post/5b8fc5536fb9a05d2d01fb11

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.