06-五大数据类型

五大数据类型

========================================================================

String(字符串)

127.0.0.1:6379> set key1 v1 #设置值

OK

127.0.0.1:6379> get key1 #获得值

“v1”

127.0.0.1:6379> keys *

  1. “key1”

127.0.0.1:6379> EXISTS key1 # 判断是否存在

(integer) 1

127.0.0.1:6379> APPEND key1 “hello” #追加字符串,不存在就相当于set key

(integer) 7

127.0.0.1:6379> get key1

“v1hello”

127.0.0.1:6379> STRLEN key1 # 查看key1 长度

(integer) 7

127.0.0.1:6379> APPEND key1 “,kuangshen”

(integer) 17

127.0.0.1:6379> get key1

“v1hello,kuangshen”

127.0.0.1:6379>

######################################################################

127.0.0.1:6379> set views 0 # 设置初始值

OK

127.0.0.1:6379> get views

“0”

127.0.0.1:6379> incr views #自增1

(integer) 1

127.0.0.1:6379> incr views #自增1

(integer) 2

127.0.0.1:6379> get views

“2”

127.0.0.1:6379> decr views #自减一

(integer) 1

127.0.0.1:6379> decr views #自减一

(integer) 0

127.0.0.1:6379> decr views #自减一

(integer) -1

127.0.0.1:6379> get views

“-1”

127.0.0.1:6379> INCRBY views 10 #设置增步长 一下增10

(integer) 9

127.0.0.1:6379> INCRBY views 10 #设置增步长 一下增10

(integer) 19

127.0.0.1:6379> DECRBY views 5 #设置减步长 一下减5

(integer) 14

127.0.0.1:6379> DECRBY views 5 #设置减步长 一下减5

(integer) 9

127.0.0.1:6379>

######################################################################

字符串范围 range

127.0.0.1:6379> set key1 “hello,kuangshen”

OK

127.0.0.1:6379> get key1

“hello,kuangshen”

127.0.0.1:6379> GETRANGE key1 0 3 #截取字符串 【0,3】

“hell”

127.0.0.1:6379> GETRANGE key1 0 -1 #获得全部的字符串 和 get 可以 get key1是一样的

“hello,kuangshen”

127.0.0.1:6379>

127.0.0.1:6379> set key2 abcdefg

OK

127.0.0.1:6379> get key2

“abcdefg”

127.0.0.1:6379> SETRANGE key2 1 xx # 途欢指定位置开始的字符串

(integer) 7

127.0.0.1:6379> get key2

“axxdefg”

127.0.0.1:6379>

######################################################################

setex (set with expire) #设置过期时间

setnx (set if not exist) #不存在在设置(在分布式锁中会常常使用!)

127.0.0.1:6379> setex key3 30 “hello” # 设置key3的值为hello,30s后过期

OK

127.0.0.1:6379> ttl key3

(integer) 26

127.0.0.1:6379> setnx mykey “redis” #如果mykey不存在,创建mykey

(integer) 1

127.0.0.1:6379> keys *

  1. “mykey”

  2. “key2”

  3. “key1”

127.0.0.1:6379> ttl key3

(integer) -2

127.0.0.1:6379> setnx mykey “mongdb” # 如果mykey存在,创建失败

(integer) 0

127.0.0.1:6379> get mykey

“redis”

127.0.0.1:6379>

######################################################################

127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3 # 同时设置多个值

OK

127.0.0.1:6379> keys *

  1. “k2”

  2. “k3”

  3. “k1”

127.0.0.1:6379> mget k1 k2 k3 # 同时获取多个值

  1. “v1”

  2. “v2”

  3. “v3”

127.0.0.1:6379> MSETNX k1 v1 k4 v4 # 原子性操作 要么都成功,要么都失败

(integer) 0

127.0.0.1:6379> keys *

  1. “k2”

  2. “k3”

  3. “k1”

127.0.0.1:6379>

######################################################################

对象

set user:1 {name:zhangsan,age:3} #设置一个user:1 对象 值为json字符来保存一个对象!

这里的key是一个巧妙的设计 : user:{id}:{filed} ,如此设计在redis中是完全OK了!

127.0.0.1:6379> mset user:1:name zhangsan user:1:age 3

OK

127.0.0.1:6379> mget user:1:name user:1:age

  1. “zhangsan”

  2. “3”

127.0.0.1:6379>

######################################################################

getset #先get 后set

127.0.0.1:6379> getset db redis #如果不存在值,则返回nil

(nil)

127.0.0.1:6379> get db

“redis”

127.0.0.1:6379> getset db mongdb #如果存在值,获取原来的值,并设置新的值

“redis”

127.0.0.1:6379> get db

“mongdb”

127.0.0.1:6379>

String类似的使用场景: value除了是我们的字符串还可以是我们的数字!

  • 计数器

  • 统计多单位的数量

  • 粉丝数

  • 对象缓存存储!


List(列表)

在redis里面,我们可以把list玩成,栈、队列、阻塞队列!

所有的list命令都是用l开头的,redis不区分大小写

127.0.0.1:6379> lpush list 1 # 将一个值或多个值,插入到列表头部 (左)

(integer) 1

127.0.0.1:6379> lpush list 2

(integer) 2

127.0.0.1:6379> lpush list 3

(integer) 3

127.0.0.1:6379> LRANGE list 0 -1 #获取list中值

  1. “3”

  2. “2”

  3. “1”

127.0.0.1:6379> LRANGE list 0 1 #通过区间获取具体的值!

  1. “3”

  2. “2”

127.0.0.1:6379> RPUSH list 4 # 将一个值或多个值,插入到列表头部 (右)

(integer) 4

127.0.0.1:6379> LRANGE list 0 -1

  1. “3”

  2. “2”

  3. “1”

  4. “4”

127.0.0.1:6379>

#########################################################

LPOP

RPOP

127.0.0.1:6379> LRANGE list 0 -1

  1. “3”

  2. “2”

  3. “1”

  4. “4”

127.0.0.1:6379> LPOP list #移除第一个元素

“3”

127.0.0.1:6379> rPOP list #移除最后一个元素

“4”

127.0.0.1:6379> LRANGE list 0 -1

  1. “2”

  2. “1”

127.0.0.1:6379>

#########################################################

127.0.0.1:6379> LRANGE list 0 -1

  1. “2”

  2. “1”

127.0.0.1:6379> LINDEX list 1 #通过下标获取某一个值

“1”

127.0.0.1:6379> LINDEX list 0

“2”

127.0.0.1:6379>

#########################################################

127.0.0.1:6379> lpush list 1

(integer) 1

127.0.0.1:6379> lpush list 2

(integer) 2

127.0.0.1:6379> lpush list 3

(integer) 3

127.0.0.1:6379> llen list # 获取列表的长度

(integer) 3

127.0.0.1:6379>

#########################################################

移除指定的值

127.0.0.1:6379> lpush list 3 #说明可以放同样的值

(integer) 4

127.0.0.1:6379> lrange list 0 -1

  1. “3”

  2. “3”

  3. “2”

  4. “1”

127.0.0.1:6379> lrem list 1 1 #移除1个1

(integer) 1

127.0.0.1:6379> lrange list 0 -1

  1. “3”

  2. “3”

  3. “2”

127.0.0.1:6379> lrem list 2 3 #移除2个3

(integer) 2

127.0.0.1:6379> lrange list 0 -1

  1. “2”

127.0.0.1:6379>

#########################################################

127.0.0.1:6379> LRANGE mylist 0 -1

  1. “hello1”

  2. “hello2”

  3. “hello3”

  4. “hello”

127.0.0.1:6379> LTRIM mylist 1 2 # 截取下标截取指定长度,只剩下被截取的元素

OK

127.0.0.1:6379> LRANGE mylist 0 -1

  1. “hello2”

  2. “hello3”

127.0.0.1:6379>

#########################################################

rpoplpush # 移除列表的最后一个元素,将他移动到新的列表

127.0.0.1:6379> LRANGE mylist 0 -1

  1. “hello2”

  2. “hello3”

127.0.0.1:6379> RPOPLPUSH mylist myotherlist # rpoplpush # 移除列表的最后一个元素,将他移动到新的列表

“hello3”

127.0.0.1:6379> LRANGE mylist 0 -1

  1. “hello2”

127.0.0.1:6379> LRANGE myotherlist 0 -1

  1. “hello3”

127.0.0.1:6379>

#########################################################

lset # 将列表中指定下标的值替换为另外一个值,更新操作

127.0.0.1:6379> exists list #判断这个列表是否存在

(integer) 0

127.0.0.1:6379> lset list 0 itemm # 如果不存在列表我们更新就会报错

(error) ERR no such key

127.0.0.1:6379> lpush list value1

(integer) 1

127.0.0.1:6379> lrange list 0 0

  1. “value1”

127.0.0.1:6379> lset list 0 itemm # 如果存在,更新当前下标的值

OK

127.0.0.1:6379> lrange list 0 0

  1. “itemm”

127.0.0.1:6379> lset list 1 other # 如果不存在,则会报错

(error) ERR index out of range

127.0.0.1:6379>

#########################################################

linsert #将某个具体的value值插入到列表中某个元素的前面或者后面!

127.0.0.1:6379> rpush mylist “hello”

(integer) 1

127.0.0.1:6379> rpush mylist “world”

(integer) 2

127.0.0.1:6379> lrange mylist 0 -1

  1. “hello”

  2. “world”

127.0.0.1:6379> linsert mylist before “world” “other”

(integer) 3

127.0.0.1:6379> lrange mylist 0 -1

  1. “hello”

  2. “other”

  3. “world”

127.0.0.1:6379> linsert mylist after “world” “new”

(integer) 4

127.0.0.1:6379> lrange mylist 0 -1

  1. “hello”

  2. “other”

  3. “world”

  4. “new”

127.0.0.1:6379>

小结

  • 他实际上是一个链表,before Node after , left , right都可以插入值

  • 如果key不存在,创建新的链表

  • 如果key存在,新增内容

  • 如果移除了所有值,空链表,也代表不存在!

  • 在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点~

消息排队!消息队列( Lpush Rpop ) ,棍( Lpush Lpop ) !


set(集合)

set中的值是不能重复的!

127.0.0.1:6379> sadd myset “hello” # set集合添加值

(integer) 1

127.0.0.1:6379> sadd myset “wolrd”

(integer) 1

127.0.0.1:6379> sadd myset “1111”

(integer) 1

127.0.0.1:6379> smembers myset #查看指定set的所有值

  1. “wolrd”

  2. “1111”

  3. “hello”

127.0.0.1:6379> SISMEMBER myset hello # 判断某一个值是不是在set集合中! 1代表有,0代表没有

(integer) 1

127.0.0.1:6379> SISMEMBER myset world

(integer) 0

127.0.0.1:6379>

#########################################################

127.0.0.1:6379> scard myset #获取长度

(integer) 3

127.0.0.1:6379>

#########################################################

127.0.0.1:6379> scard myset

(integer) 3

127.0.0.1:6379> srem myset hello #移除hello元素

(integer) 1

127.0.0.1:6379> scard myset

(integer) 2

127.0.0.1:6379> smembers myset

  1. “wolrd”

  2. “1111”

127.0.0.1:6379>

#########################################################

set 无序不重复集合 ,抽随机!

127.0.0.1:6379> smembers myset

  1. “world”

  2. “zhangsan”

  3. “1111”

127.0.0.1:6379> SRANDMEMBER myset #随机返回一个元素

“1111”

127.0.0.1:6379> SRANDMEMBER myset

“zhangsan”

127.0.0.1:6379> SRANDMEMBER myset 2 # 随机返回2个元素

  1. “wolrd”

  2. “1111”

127.0.0.1:6379>

#########################################################

删除指定的key,删除随机的key

127.0.0.1:6379> SMEMBERS myset

  1. “wolrd”

  2. “zhangsan”

  3. “1111”

127.0.0.1:6379> spop myset #随机删除一个set集合中的元素!

“wolrd”

127.0.0.1:6379> spop myset

“zhangsan”

127.0.0.1:6379> SMEMBERS myset

  1. “1111”

127.0.0.1:6379>

#########################################################

将一个指定的值,移动到另外一个set集合

127.0.0.1:6379> sadd myset “hello”

(integer) 1

127.0.0.1:6379> sadd myset “world”

(integer) 1

127.0.0.1:6379> sadd myset “lisi”

(integer) 1

127.0.0.1:6379> sadd myset2 “set2”

(integer) 1

127.0.0.1:6379> smove myset myset2 “lisi” # 将一个指定的值,移动到另外一个set集合

(integer) 1

127.0.0.1:6379> SMEMBERS myset

  1. “world”

  2. “hello”

127.0.0.1:6379> SMEMBERS myset2

  1. “lisi”

  2. “set2”

127.0.0.1:6379>

#########################################################

微博 ,B站 ,共同关注!(并集)

  • 交集

  • 并集

  • 差集

127.0.0.1:6379> sadd jihe1 a

(integer) 1

127.0.0.1:6379> sadd jihe1 b

(integer) 1

127.0.0.1:6379> sadd jihe1 c

(integer) 1

127.0.0.1:6379> sadd jihe2 c

(integer) 1

127.0.0.1:6379> sadd jihe2 d

(integer) 1

127.0.0.1:6379> sadd jihe2 e

(integer) 1

127.0.0.1:6379> sdiff jihe1 jihe2 # 差集

  1. “a”

  2. “b”

127.0.0.1:6379> sinter jihe1 jihe2 # 交集 共同好友就可以这样实现

  1. “c”

127.0.0.1:6379> sunion jihe1 jihe2 # 并集

  1. “a”

  2. “b”

  3. “c”

  4. “d”

  5. “e”

127.0.0.1:6379>

应用场景

微f博,A用户将所有关注的人放在一个set集合中!将它的粉丝也放在一个集合中!

共同关注,共同爱好,二度好友,推荐好友!(六度分割理论)


Hash

Map集合 ,key-map!时候这个值是一个map集合! 并内置和String类型没有太大区别,还是一个简单的key-value!

127.0.0.1:6379> hset myhash filed kuangshen # set一个具体的key-value

(integer) 1

127.0.0.1:6379> hget myhash filed #获取一个值

“kuangshen”

127.0.0.1:6379> hmset myhash filed1 hello field2 world # 设置多个值

OK

127.0.0.1:6379> hmget myhash filed1 field2 #获取多个值

  1. “hello”

  2. “world”

127.0.0.1:6379> hgetall myhash #获取所有值 key-value展示

  1. “filed”

  2. “kuangshen”

  3. “field2”

  4. “world”

  5. “filed1”

  6. “hello”

127.0.0.1:6379>

#########################################################

127.0.0.1:6379> hgetall myhash

  1. “filed”

  2. “hello”

  3. “field2”

  4. “world”

  5. “filed1”

  6. “hello”

127.0.0.1:6379> hdel myhash filed1 #删除filed1,对应的value也没了

(integer) 1

127.0.0.1:6379> hgetall myhash

  1. “filed”

  2. “hello”

  3. “field2”

  4. “world”

127.0.0.1:6379> hset myhash filed kuangshen # 修改filed的值

(integer) 0

127.0.0.1:6379> hgetall myhash

  1. “filed”

  2. “kuangshen”

  3. “field2”

  4. “world”

127.0.0.1:6379>

#########################################################

127.0.0.1:6379> hlen myhash #获取hash表的字段数量

(integer) 2

127.0.0.1:6379>

#########################################################

127.0.0.1:6379> hgetall myhash

  1. “filed”

  2. “kuangshen”

  3. “field2”

  4. “world”

127.0.0.1:6379> hlen myhash

(integer) 2

127.0.0.1:6379> HEXISTS myhash field1 # 判断是否有这个字段 有为1,没有为0

(integer) 0

127.0.0.1:6379> HEXISTS myhash field2

(integer) 1

#########################################################

127.0.0.1:6379> HGETALL myhash

  1. “filed”

  2. “kuangshen”

  3. “field2”

  4. “world”

127.0.0.1:6379> keys *

  1. “myhash”

127.0.0.1:6379> hkeys myhash # 只获取所有的key

  1. “filed”

  2. “field2”

127.0.0.1:6379> hvals myhash # 只获取所有的 value

  1. “kuangshen”

  2. “world”

127.0.0.1:6379>

#########################################################

127.0.0.1:6379> hset myhash field3 5

(integer) 1

127.0.0.1:6379> HINCRBY myhash field3 1 #自增1

(integer) 6

127.0.0.1:6379> HGETALL myhash

  1. “filed”

  2. “kuangshen”

  3. “field2”

  4. “world”

  5. “field3”

  6. “6”

127.0.0.1:6379> HINCRBY myhash field3 -1 #增-1 相当于 减一

(integer) 5

127.0.0.1:6379> hsetnx myhash field4 hello # 如果不存在则可以设置

(integer) 1

127.0.0.1:6379> hsetnx myhash field4 world # 如果存在则不能设置

(integer) 0

127.0.0.1:6379> HGETALL myhash

  1. “filed”

  2. “kuangshen”

  3. “field2”

  4. “world”

  5. “field3”

  6. “5”

  7. “field4”

  8. “hello”

127.0.0.1:6379>

应用场景

hash变更的数据user name age,尤其是是用户信息之类的,经常变动的信息!hash 更适合于对象的存储,String更加适合字符串存储!


Zset(有序集合)

在set的基础上,增加了一个值,set k1 v1 zset k1 score v1

127.0.0.1:6379> zadd myset 1 one #添加一个值

(integer) 1

127.0.0.1:6379> zadd myset 2 two 3 three #添加多个值

(integer) 2

127.0.0.1:6379> zrange myset 0 -1 #遍历

  1. “one”

  2. “two”

  3. “three”

127.0.0.1:6379>

#########################################################

排序如何实现

127.0.0.1:6379> zadd salary 2500 xiaohong

(integer) 1

127.0.0.1:6379> zadd salary 5000 zhangsan

(integer) 1

127.0.0.1:6379> zadd salary 500 lisi

(integer) 1

127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf # 显示所有用户从小到大排序 (负无穷 ~ 正无穷)

  1. “lisi”

  2. “xiaohong”

  3. “zhangsan”

127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores # 显示所有用户从小到大排序 带上薪水

  1. “lisi”

  2. “500”

  3. “xiaohong”

  4. “2500”

  5. “zhangsan”

  6. “5000”

127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores # 显示所有用户带上薪水 小于2500的

  1. “lisi”

  2. “500”

  3. “xiaohong”

  4. “2500”

127.0.0.1:6379>

127.0.0.1:6379> ZREVRANGE salary 0 -1 # 降序 从大到小

  1. “zhangsan”

  2. “lisi”

127.0.0.1:6379>

#########################################################

移除元素

127.0.0.1:6379> zrange salary 0 -1

  1. “lisi”

  2. “xiaohong”

  3. “zhangsan”

127.0.0.1:6379> zrem salary xiaohong #移除小红

(integer) 1

127.0.0.1:6379> zrange salary 0 -1

  1. “lisi”

  2. “zhangsan”

127.0.0.1:6379>

#########################################################

127.0.0.1:6379> zcard salary #获取个数

(integer) 2

127.0.0.1:6379>

#########################################################

127.0.0.1:6379> zadd myset 1 hello

(integer) 1

127.0.0.1:6379> zadd myset 2 world 3 kuangshen

(integer) 2

127.0.0.1:6379> zcount myset 1 3 # 获取指定区间的成员数量

(integer) 3

127.0.0.1:6379> zcount myset 1 2

(integer) 2

127.0.0.1:6379>

其与的一些API,通过我们的学习吗,你们剩下的如果工作中有需要,这个时候你可以去查查看官方文档!案例思路:

set排序存储班级成绩表,工资表排序!
普通消息,1,重要消息2。带权重进行判断!
排行榜应用实现,取Top N测试!

最后
如果你想要学习Java的话,我给你分享一些Java的学习资料,你不用浪费时间到处搜了,从Java入门到精通的资料我都给你整理好了,这些资料都是我做Java这几年整理的Java最新学习路线,Java笔试题,Java面试题,Java零基础到精通视频课程,Java开发工具,Java练手项目,Java电子书,Java学习笔记,PDF文档教程,Java程序员面经,Java求职简历模板等,这些资料对你接下来学习Java一定会带来非常大的帮助,每个Java初学者都必备。
原文链接:https://gitee.com/hh090807

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值