redis 五大数据结构

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它能够用作数据库、缓存和消息中间件

它反对多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 汇合(sets), 有序汇合(sorted sets) 与范畴查问, bitmaps, hyperloglogs 和 天文空间(geospatial) 索引半径查问

Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘长久化(persistence), 并通过 Redis哨兵(Sentinel)和主动 分区(Cluster)提供高可用性(high availability)

redis key 的根本命令

  • ping

查看客户端是否连贯胜利

  • set key value

设置 key 和 value

  • get key

获取 key 的值

  • keys *

获取所有 key

  • move key 1

删除 key

  • expire key number

对 key 设置过期工夫

  • ttl key

查看 key 的残余无效工夫

  • type key

查看 key 的类型

  • EXISTS key

查看是否存在 key

root@iZuf66y3tuzn4wp3h02t7pZ:/# redis-cli -p 6379127.0.0.1:6379> pingPONG127.0.0.1:6379> keys *(empty array)127.0.0.1:6379> set name xiaomotongOK127.0.0.1:6379> get name"xiaomotong"127.0.0.1:6379> type namestring127.0.0.1:6379> EXISTS name(integer) 1127.0.0.1:6379> EXISTS xiaozhu(integer) 0127.0.0.1:6379> set age 18OK127.0.0.1:6379> keys *1) "name"2) "age"127.0.0.1:6379> set hobby sportsOK127.0.0.1:6379> EXPIRE hobby 20(integer) 1127.0.0.1:6379> ttl hobby(integer) 14127.0.0.1:6379> ttl hobby(integer) 13127.0.0.1:6379> get hobby(nil)127.0.0.1:6379> move name 1(integer) 1127.0.0.1:6379> keys *1) "age"127.0.0.1:6379>

string 字符串

设置单个值

  • APPEND key value

在字符串前面追加字符串

  • STRLEN key

计算 key 对应 value 的长度

  • incr key

对 key 的值 +1

  • decr key

对 key 的值 -1

  • INCRBY key number

对 key +number

  • DECRBY key number

对 key -number

  • GETRANGE key start end

获取字符范畴,获取 key 对应 value 的 第 start 到 end 的字符串

GETRANGE key 0 -1get key 是一个成果

  • setrange key offset value

替换 key 对应 value 从左到有 offset 个偏移量前面的字符串

127.0.0.1:6379> set name xiaozhuOK127.0.0.1:6379> get name"xiaozhu"127.0.0.1:6379> APPEND name xiaopang(integer) 15127.0.0.1:6379> get name"xiaozhuxiaopang"127.0.0.1:6379> STRLEN name(integer) 15127.0.0.1:6379> set views 0OK127.0.0.1:6379> incr views(integer) 1127.0.0.1:6379> incr views(integer) 2127.0.0.1:6379> incr views(integer) 3127.0.0.1:6379> decr views(integer) 2127.0.0.1:6379> get views"2"127.0.0.1:6379> INCRBY views 20(integer) 22127.0.0.1:6379> get views"22"127.0.0.1:6379> DECRBY views 10(integer) 12127.0.0.1:6379> get views"12"127.0.0.1:6379> set words "hello wrold"OK127.0.0.1:6379> GETRANGE words 2 5"llo "127.0.0.1:6379> set key1 xiaozhupeiqiOK127.0.0.1:6379> GETRANGE key1 0 -1"xiaozhupeiqi"127.0.0.1:6379>127.0.0.1:6379> setrange key1 4 pangziyo(integer) 12127.0.0.1:6379> get key1"xiaopangziyo"
  • setex key second value (set with expire)

设置 key 对应的过期工夫 ,

  • ttl key

查看 key 的无效工夫

  • setnx key value (if not exist)

如果 key 不存在,那就设置 , 这个指令通常用于分布式锁

127.0.0.1:6379> setex call 30 xiaomotongOK127.0.0.1:6379> ttl call(integer) 24127.0.0.1:6379> ttl call(integer) 21127.0.0.1:6379> setnx call xiaozhu(integer) 1127.0.0.1:6379> get call"xiaozhu"127.0.0.1:6379> setnx call xiaoming(integer) 0127.0.0.1:6379> get call"xiaozhu"

批量设置多个值

  • mset key value [key value ...]

设置多个 key value

  • mget key [key ...]

获取多个 key 对应的值

  • MSETNX key value [key value ...]

设置多个值,如果 key 不存在,则设置值,这是一个原子操作,要么全副胜利,要么全副失败

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 k4 v4OK127.0.0.1:6379> keys *1) "k2"2) "k4"3) "k3"4) "k1"127.0.0.1:6379> mget k1 k2 k3 k41) "v1"2) "v2"3) "v3"4) "v4"127.0.0.1:6379> msetnx k4 44(integer) 0127.0.0.1:6379> msetnx k4 44 k5 55(integer) 0

设置对象

设置对象,咱们能够将 redis 的 key 设计成为咱们业务须要的字符 key ,例如上面的例子

127.0.0.1:6379> set student:1:name xiaozhuyOK127.0.0.1:6379> set student:2:name xiaopangziOK127.0.0.1:6379> mset student:3:name xiaopeiqi student:3:age 18 student:3:hobby basketballOK127.0.0.1:6379> keys student:3*1) "student:3:hobby"2) "student:3:age"3) "student:3:name"127.0.0.1:6379> mget student:3:hobby student:3:age student:3:name1) "basketball"2) "18"3) "xiaopeiqi"
  • getset

先 get 值,再 set 值

127.0.0.1:6379> getset location beijing(nil)127.0.0.1:6379> get location"beijing"127.0.0.1:6379> getset location changsha"beijing"127.0.0.1:6379> get location"changsha"

string 字符串的应用场景

string 类型的应用场景十分多,如下列举一些:

  • 计数器
  • 统计多个单位的数量
  • 对象缓存存储
  • 分数,粉丝数,点赞量 等等

List

List 是根本数据类型,即列表

在 redis 的 List 外面,咱们能够模仿栈,队列,阻塞队列等等

  • LPUSH key element [element ...]

从右边插入数据到 key 中,这个 key 是有个list , list 类型的指令都是 l 结尾

  • RPUSH key element [element ...]

    从左边插入数据到 key 中

  • LRANGE key start stop

查看 list 的范畴,

LRANGE key 0 1 查看以后 list 的全副值

127.0.0.1:6379> LPUSH mylist k1(integer) 1127.0.0.1:6379> LPUSH mylist k2(integer) 2127.0.0.1:6379> LPUSH mylist k3(integer) 3127.0.0.1:6379> LRANGE 0 -1(error) ERR wrong number of arguments for 'lrange' command127.0.0.1:6379> LRANGE mylist 0 -11) "k3"2) "k2"3) "k1"127.0.0.1:6379> LRANGE mylist 0 11) "k3"2) "k2"127.0.0.1:6379> RPUSH mylist 4(integer) 4127.0.0.1:6379> RPUSH mylist 5(integer) 5127.0.0.1:6379> lrange mylist 0 -11) "k3"2) "k2"3) "k1"4) "4"5) "5"
  • LPOP key [count]

从 list 的右边移除数据,默认是 1 个 ,即为移除 list 的第一个元素

  • RPOP key [count]

从 list 的左边移除数据 , 即为移除 list 的最初一个元素

127.0.0.1:6379> LPOP mylist"k3"127.0.0.1:6379> LPOP mylist 21) "k2"2) "k1"127.0.0.1:6379> lrange mylist 0 -11) "4"2) "5"127.0.0.1:6379> RPOP mylist"5"127.0.0.1:6379> lrange mylist 0 -11) "4"
  • LINDEX key index

查看 list 中第 index 个值,从 0 开始

127.0.0.1:6379> keys *1) "mylist"127.0.0.1:6379> LRANGE mylist 0 -11) "4"127.0.0.1:6379> LINDEX mylist 1(nil)127.0.0.1:6379> LINDEX mylist 0"4"
  • LLEN key

查看 list 的长度

127.0.0.1:6379> LLEN mylist(integer) 1127.0.0.1:6379> LPUSH mylist k6(integer) 2127.0.0.1:6379> LPUSH mylist k7(integer) 3127.0.0.1:6379> LLEN mylist(integer) 3
  • LREM key count element

删除 list 中指定的元素,能够指定删除多少个

127.0.0.1:6379> lpush mylist one two three four five(integer) 5127.0.0.1:6379> lrange mylist 0 -11) "five"2) "four"3) "three"4) "two"5) "one"127.0.0.1:6379> LREM mylist 1 five(integer) 1127.0.0.1:6379> LRANGE mylist 0 -11) "four"2) "three"3) "two"4) "one"127.0.0.1:6379> lpush mylist one(integer) 5127.0.0.1:6379> LRANGE mylist 0 -11) "one"2) "four"3) "three"4) "two"5) "one"127.0.0.1:6379> LREM mylist 2 one(integer) 2127.0.0.1:6379> LRANGE mylist 0 -11) "four"2) "three"3) "two"127.0.0.1:6379> LREM mylist 4 ll(integer) 0

LREM 删除 list 中不存在的数据,返回 0 ,0 为失败,

LREM 删除 list 中存在的数据,若期望删除 5 个,实际上只有 2 个,那么redis 会返回 2 ,删除胜利

  • LTRIM key start stop

裁剪,剪枝,获取 list 的某一段,并裁剪下来

127.0.0.1:6379> LRANGE mylist 0 -11) "k5"2) "k4"3) "k3"4) "k2"5) "k1"6) "four"7) "three"8) "two"127.0.0.1:6379> LTRIM mylist 3 5OK127.0.0.1:6379> LRANGE mylist 0 -11) "k2"2) "k1"3) "four"
  • RPOPLPUSH source destination

从源 list 中的左边取出数据,从目标 list 的右边退出数据

127.0.0.1:6379> LRANGE mylist 0 -11) "k2"2) "k1"3) "four"127.0.0.1:6379> RPOPLPUSH mylist newlist"four"127.0.0.1:6379>127.0.0.1:6379> lrange newlist 0 -11) "four"
  • LSET key index element

将 list 中的对应索引的数据,替换成 element ,如果索引本没有数据,则会报错

127.0.0.1:6379> lrange mylist  0 -11) "k2"2) "k1"127.0.0.1:6379> LSET mylist 1 helloOK127.0.0.1:6379> lrange mylist  0 -11) "k2"2) "hello"127.0.0.1:6379> LSET mylist 10 world(error) ERR index out of range
  • LINSERT key BEFORE|AFTER pivot element

    list 中在指定元素的后面或者前面增加数据

127.0.0.1:6379> lrange mylist  0 -11) "k2"2) "hello"127.0.0.1:6379> LINSERT mylist before hello xiaozhu(integer) 3127.0.0.1:6379> lrange mylist  0 -11) "k2"2) "xiaozhu"3) "hello"127.0.0.1:6379> LINSERT mylist after hello bottom(integer) 4127.0.0.1:6379> lrange mylist  0 -11) "k2"2) "xiaozhu"3) "hello"4) "bottom"
  • list 理论是一个链表,before node , after node ,left ,right 都是能够插入数据的
  • 如果 key 不存在,会创立新的 key ,即创立新的链表
  • 如果 key 存在,失常退出数据
  • 如果移除了所有的值,那么 key 就不存在了
  • 在 list 的两边插入和删除数据效率最高,从两头操作数据,效率绝对较低

list 列表的利用场景:

list 能够做音讯队列(FIFO),也能够做栈(FILO)

欢送点赞,关注,珍藏

敌人们,你的反对和激励,是我保持分享,提高质量的能源

好了,本次就到这里

技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。

我是小魔童哪吒,欢送点赞关注珍藏,下次见~