6.redis五大基本数据类型
五大基本的数据类型:
1.Striing类型
1.String类型
1.追加内容
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"wmd"
127.0.0.1:6379> APPEND name "hello"(使用APPEND可以追加字符串)
(integer) 8
127.0.0.1:6379> get name
"wmdhello"
127.0.0.1:6379>
若追加的key不存在,相当于新创建了一个记录
127.0.0.1:6379> APPEND age "18"
(integer) 2
127.0.0.1:6379> keys *
1) "age"
2) "name"
2.字符串长度:STRLEN key值
127.0.0.1:6379> STRLEN name
(integer) 8
3.数字加一和减一的操作
127.0.0.1:6379> get age
"18"
127.0.0.1:6379> INCR age (age+1)
(integer) 19
127.0.0.1:6379> get age
"19"
127.0.0.1:6379> DECR age(age-1)
(integer) 18
127.0.0.1:6379> get age
"18"
4.设置步长增加
127.0.0.1:6379> INCRBY age 10(增加10)
(integer) 28
127.0.0.1:6379> get age
"28"
127.0.0.1:6379> DECRBY age 5
(integer) 23(基础上减5)
127.0.0.1:6379> get age
"23"
5.截取字符串GETRANGE(range:范围)
127.0.0.1:6379> set key1 hello,wmd
OK
127.0.0.1:6379> get key1
"hello,wmd"
127.0.0.1:6379> GETRANGE key1 0 4(截取key1字符串的0-4位)
"hello"
127.0.0.1:6379> GETRANGE key1 0 -1(截取key1字符串的全部-1代表结尾)
"hello,wmd"
6.字符串替换(SETRANGE)
127.0.0.1:6379> SETRANGE key1 1 ld(从key1的1位置处开始替换,ld有两个字符,对应的替换其两个字符)
(integer) 9
127.0.0.1:6379> get key1
"hldlo,wmd"
127.0.0.1:6379> SETRANGE key1 1 ld
(integer) 9
127.0.0.1:6379> get key1
"hldlo,wmd"
7.设置过期时间:SETEX(set with expire:设置如果存在)
127.0.0.1:6379> SETEX key3 30 wmd
OK
127.0.0.1:6379> ttl key3
(integer) 25
结论:30秒后会删除掉key3
骚操作
127.0.0.1:6379> SETEX key3 30 wmd(设置key3过期时间为30秒,并设置内容是wmd)
OK
127.0.0.1:6379> ttl key3
(integer) 25
127.0.0.1:6379> get key3
"wmd"
127.0.0.1:6379> SETEX key3 50 ld(在未过期期间,重新更改key3的值和过期时间)
OK
127.0.0.1:6379> ttl key3(发现过期时间发生了更改,并且内容也发生更改)
(integer) 43
127.0.0.1:6379> get key3
"ld"
8.不覆盖赋值:SETNX(set if not expire:如果不存在会)如果存在就不会创建,分布式锁中会用到!!
127.0.0.1:6379> SETNX key4 redis(设置key4的值,返回1表示设置成功)
(integer) 1
127.0.0.1:6379> get key4
"redis"
127.0.0.1:6379> SETNX key4 modb(使用SETNX重新设置key4值,返回0)
(integer) 0
127.0.0.1:6379> get key4(获取key4仍是redis)
"redis"
127.0.0.1:6379> set key4 modb(但是可以使用set命令直接更改)
OK
127.0.0.1:6379> get key4
"modb"
9.批量的设置值:MSET
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
3) "k3"
10.批量的取数据MGET
127.0.0.1:6379> MGET k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
11.批量的存在就不保存操作:MSETNX(和SETNX有异曲同工之妙)
127.0.0.1:6379> MSETNX k3 k3_bak k4 v4
(integer) 0
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
3) "k3"
结论:发现 MSETNX 是原子性操作,失败都失败,因有k3,所以k3的值设置失败,后面的k4也没有设置
11.存入对象:设置一个user1对象,值是json字符串
127.0.0.1:6379> keys *
1) "user:1"
127.0.0.1:6379> GET user:1
"{name:wmd,age:18}"
12.也可以如此设置:这是key的巧妙设计(user:wmd:{id}:name)
127.0.0.1:6379> MSET user:wmd:1:name wmd user:wmd:1:age 18
OK
127.0.0.1:6379> keys *
1) "user:wmd:1:age"
2) "user:wmd:1:name"
127.0.0.1:6379> MGET user:wmd:1:name user:wmd:1:age
1) "wmd"
2) "18"
13.先get后set的组合命令:GETSET
127.0.0.1:6379> GETSET db redis(如果不存在值,则返回nil,并set入新值)
(nil)
127.0.0.1:6379> get db(如果存在值,则返回原来的值,并set新的值)
"redis"
127.0.0.1:6379> GETSET db mongdb
"redis"
127.0.0.1:6379> get db
"mongdb"
总结:String类型的使用场景,value除了可以是字符串外,还可以是数字
。通过加一减一的操作实现计数器
。统计多单位的数量
。粉丝数
。对象存储
2.List类型
在redis中,可以将list玩成栈(一端开放:先进后出),队列(两端开放:一端放,一端取,先进先出),阻塞队列(两边都可以放,两边都可以取)
list中的命令大都是以L开头的
1.从左向右放值:LPUSH
127.0.0.1:6379> LPUSH wmd one
(integer) 1
127.0.0.1:6379> LPUSH wmd two
(integer) 2
127.0.0.1:6379> LPUSH wmd three
(integer) 3
127.0.0.1:6379> LRANGE wmd 0 -1(从左向右取值0 -1代表取全部的值:发现后放入的值在前)
1) "three"
2) "two"
3) "one"
2.从右边放值:RPUSH(从右边放值)
127.0.0.1:6379> RPUSH wmd four
(integer) 4
127.0.0.1:6379> LRANGE wmd 0 -1(取出所有的值发现RPUSH放入的值在后面)
1) "three"
2) "two"
3) "one"
4) "four"
3.获取list中的值LRANGE 名称 开始 结束
127.0.0.1:6379> LRANGE wmd 0(获取第一个元素:这种命令不可用,报错,必须指定结束位置)
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> LRANGE wmd 0 1(获取第一个和第二个元素)
1) "three"
2) "two"
127.0.0.1:6379> LRANGE wmd 0 0(开始位置和结束位置相同,获取第一个元素)
1) "three"
4.移除命令:LPOP 队列名(从左侧移除第一个元素)/RPOP 队列名(从右侧移除第一个元素)
原始:
1) "three"
2) "two"
3) "one"
4) "four"
127.0.0.1:6379> LPOP wmd (从左侧移除第一个元素)
"three"
127.0.0.1:6379> LRANGE wmd 0 -1(发现移除了three)
1) "two"
2) "one"
3) "four"
127.0.0.1:6379> RPOP wmd (右侧移除第一个元素)
"four"
127.0.0.1:6379> LRANGE wmd 0 -1(发现移除了four)
1) "two"
2) "one"
5.获取队列的某一个值:LINDEX 队列名 下标
127.0.0.1:6379> LRANGE wmd 0 -1
1) "two"
2) "one"
127.0.0.1:6379> LINDEX wmd 1(获取wmd队列的第二个值)
"one"
6.队列的长度:LLEN 队列名
127.0.0.1:6379> LLEN wmd
(integer) 2
7.移除某个固定的值:LREM 队列名称 移除几个(因为队列中可以有重复的值) 移除的名称
127.0.0.1:6379> LRANGE wmd 0 -1(往集合中放入重复的four和three,以及不重复的one和two)
1) "four"
2) "four"
3) "three"
4) "three"
5) "two"
6) "one"
127.0.0.1:6379> LREM wmd 1 one(移除集合中的一个one)
(integer) 1
127.0.0.1:6379> LRANGE wmd 0 -1(发现队列中的one被移除)
1) "four"
2) "four"
3) "three"
4) "three"
5) "two"
127.0.0.1:6379>
127.0.0.1:6379> LREM wmd 1 four(移除队列中的一个four)
(integer) 1
127.0.0.1:6379> LRANGE wmd 0 -1(发现队列中的一个four被移除,还剩一个four)
1) "four"
2) "three"
3) "three"
4) "two"
127.0.0.1:6379> LREM wmd 2 three(移除队列中的两个three)
(integer) 2
127.0.0.1:6379> LRANGE wmd 0 -1(发现对列中的两个three都被移除)
1) "four"
2) "two"
8.截取固定范围的值:LTRIM 队列名称 开始位置 结束位置
127.0.0.1:6379> RPUSH wmd hello1
(integer) 1
127.0.0.1:6379> RPUSH wmd hello2
(integer) 2
127.0.0.1:6379> RPUSH wmd hello3
(integer) 3
127.0.0.1:6379> RPUSH wmd hello4
(integer) 4
127.0.0.1:6379> LRANGE wmd 0 -1
1) "hello1"
2) "hello2"
3) "hello3"
4) "hello4"
127.0.0.1:6379> LTRIM wmd 1 2(截取从1-2的元素)
OK
127.0.0.1:6379> LRANGE wmd 0 -1
1) "hello2"
2) "hello3"
8.移除列表的最后一个元素并添加到新的列表中:组合命令:RPOPLPUSH 原列表 新的列表(从右边拿到原列表的最后一个元素并从左边添加到新的列表中)
127.0.0.1:6379> LRANGE wmd 0 -1(原队列中的元素如下:)
1) "hello1"
2) "hello2"
3) "hello3"
127.0.0.1:6379> RPOPLPUSH wmd wmd2(取出原列表wmd的最后一个元素并添加到新的列表中wmd2)
"hello3"
127.0.0.1:6379> LRANGE wmd 0 -1(发现原列表的最后一个元素被删除)
1) "hello1"
2) "hello2"
127.0.0.1:6379> LRANGE wmd2 0 -1(移动到新的列表中wmd2)
1) "hello3"
127.0.0.1:6379> RPOPLPUSH wmd wmd2
"hello2"
127.0.0.1:6379> LRANGE wmd2 0 -1(发现新列表元素是从左边开始放的)
1) "hello2"
2) "hello3"
9.将列表的指定下标的值替换成其他值:lset 队列名 下表 替换的值(1.列表必须存在 2.列表中需要替换的元素必须存在)
127.0.0.1:6379> lset wmd 0 v1(当不存在列表时替换会报错)
(error) ERR no such key
127.0.0.1:6379> RPUSH wmd v1(创建了列表,并放入一个元素v1)
(integer) 1
127.0.0.1:6379> LRANGE wmd 0 -1
1) "v1"
127.0.0.1:6379> LSET wmd 0 firstOne(替换wmd列表的第一个元素为firstOne)
OK
127.0.0.1:6379> LRANGE wmd 0 -1(替换成功)
1) "firstOne"
127.0.0.1:6379> LSET wmd 1 secordOne(替换不存在的2元素报错)
(error) ERR index out of range
10.在列表指定元素的前后插入元素: LINSERT 列表 before/after 列表中的元素 插入的元素
127.0.0.1:6379> RPUSH wmd v1(创建一个v1,v2的列表)
(integer) 1
127.0.0.1:6379> RPUSH wmd v2
(integer) 2
127.0.0.1:6379> LRANGE wmd 0 -1
1) "v1"
2) "v2"
127.0.0.1:6379> LINSERT wmd before v2 ld(在v2的前面插入ld)
(integer) 3
127.0.0.1:6379> LRANGE wmd 0 -1(插入成功)
1) "v1"
2) "ld"
3) "v2"
127.0.0.1:6379> LINSERT wmd after ld wmd (在ld的后面插入wmd)
(integer) 4
127.0.0.1:6379> LRANGE wmd 0 -1(插入成功)
1) "v1"
2) "ld"
3) "wmd"
4) "v2"
127.0.0.1:6379> LINSERT wmd after ee wmd (如果在队列中没有的元素前后插入会返回-1)
(integer) -1
小结:
1.其实就是一个链表,左右都可以插入数据
2.如果key(就是链表)不存在,就创建新的链表
3.如果key存在,新增内容
4.如果移除了所有内容,空链表,也代表不存在
5.在两边插入或改动值,效率会更高,中间元素,效率会低点
6.可以做成消息队列(左边放,右边取)也可以做成栈(左边放,左边取)
SET(集合)
1.set中的值是不能重复的
2.set的命令大都是s开头的
3.set是无序不重复集合
1.往set集合中放值:SADD 集合名称 值
127.0.0.1:6379> SADD wmd "v1"
(integer) 1
127.0.0.1:6379> SADD wmd "v2"
(integer) 1
127.0.0.1:6379> SADD wmd "v3"
(integer) 1
127.0.0.1:6379> SMEMBERS wmd(取出队列的值)
1) "v3"
2) "v1"
3) "v2"
2.判断集合中是否存在指定的值:SISMEMBER set集合名称 对应的值
127.0.0.1:6379> SISMEMBER wmd ld
(integer) 0(返回0是不存在)
127.0.0.1:6379> SISMEMBER wmd v1
(integer) 1(返回1是存在)
3.返回set集合的长度:scard 集合名称
127.0.0.1:6379> SCARD wmd(返回wmd集合的长度)
(integer) 4
4.移除集合中的指定元素:SREM 集合名称 元素值
127.0.0.1:6379> SREM wmd 5(移除不存在的值时返回的时0)
(integer) 0
127.0.0.1:6379> SREM wmd v1(移除存在的值返回的时1)
(integer) 1
5.随机抽选出集合中的一个或多个值:SRANDMEMBER 集合名称 抽取的个数
127.0.0.1:6379> SRANDMEMBER wmd(随机抽选出一个值)
"v2"
127.0.0.1:6379> SRANDMEMBER wmd (随机抽选出一个值)
"45"
127.0.0.1:6379> SRANDMEMBER wmd 2(随机抽选出两个值)
1) "v3"
2) "v2"
6.随机的删除单个或多个值:SPOP set名称 随机删除的个数
127.0.0.1:6379> SMEMBERS wmd
1) "v3"
2) "v4"
3) "v1"
4) "v2"
5) "v5"
127.0.0.1:6379> SPOP wmd 2(随机删除两个)
1) "v3"
2) "v1"
127.0.0.1:6379> SPOP wmd(随机删除一个)
"v4"
127.0.0.1:6379> SMEMBERS wmd
1) "v5"
2) "v2"
7.将set集合中的元素移动到另外一个集合中:SMOVE 原集合 目标集合 移动元素
127.0.0.1:6379> SMEMBERS wmd(wmd的元素)
1) "wmd4"
2) "wmd3"
3) "wmd2"
4) "wmd1"
127.0.0.1:6379> SMOVE wmd ld wmd1(将wmd中的wmd1元素移动到ld集合中,若ld集合不存在,则创建)
(integer) 1
127.0.0.1:6379> keys *
1) "ld"
2) "wmd"
127.0.0.1:6379> SMEMBERS ld
1) "wmd1"
8.多个set集合的交集/差集/并集
1.交集:两个集合相同的部分:SINTER 集合1 集合2
2.差集:两个集合不一样的地方:SDIFF 集合1 集合2(集合1中没有集合2中的元素)
3.并集:两个集合的并集:SUNION 集合1 集合2
127.0.0.1:6379> SMEMBERS wmd(两个集合wmd/ld,两个集合都有c元素)
1) "c"
2) "a"
3) "b"
127.0.0.1:6379> SMEMBERS ld(两个集合wmd/ld,两个集合都有c元素)
1) "c"
2) "e"
3) "d"
127.0.0.1:6379> SDIFF wmd ld(差集:已wmd集合为基础,查询wmd集合中没有ld集合的元素,即差集)
1) "a"
2) "b"
127.0.0.1:6379> SINTER wmd ld(两个集合的交集)
1) "c"
127.0.0.1:6379> SUNION wmd ld(两个集合的并集)
1) "a"
2) "c"
3) "e"
4) "b"
5) "d"
Hash(哈希)
map集合,key-map集合:本质上和string没有区别,还是一个简单的key-value
命令大多是h开头的
1.放值/取值:hset/hget
127.0.0.1:6379> HSET myhash k1 v1(HSET hash名称 key值 value值)
(integer) 1
127.0.0.1:6379> HGET myhash k1(hget hash名称 key)
"v1"
2.批量插入和批量获取:
127.0.0.1:6379> HMSET myhash k1 v1_bak k2 v2 k3 v3(HMSET hash名称 k1 v1 k2 v2)如果存在key,则会覆盖其value值
OK
127.0.0.1:6379> HMGET myhash k1 k2 k3 (批量获取HMGET hash名称 k1 k2 k3)
1) "v1_bak"
2) "v2"
3) "v3"
3.获取hash中的所有key和value:HGETALL hash名称
127.0.0.1:6379> HGETALL myhash(返回的是key和value)
1) "k1"
2) "v1_bak"
3) "k2"
4) "v2"
5) "k3"
6) "v3"
4.删除hash中指定的key字段,对应的value值也就消失了
127.0.0.1:6379> HGETALL myhash(获取全部的key和value)
1) "k1"
2) "v1_bak"
3) "k2"
4) "v2"
5) "k3"
6) "v3"
127.0.0.1:6379> HDEL myhash k1(删除myhash中的k1键值对)
(integer) 1
127.0.0.1:6379> HGETALL myhash(发现key1键值对已被删除)
1) "k2"
2) "v2"
3) "k3"
4) "v3"
5.返回hash的键值对长度:HLEN hash名称
127.0.0.1:6379> HGETALL myhash
1) "k2"
2) "v2"
3) "k3"
4) "v3"
127.0.0.1:6379> HLEN myhash(返回的是hash的键值对长度)
(integer) 2
6.判断hash中是否存在指定的key:HEXISTS hash名称 key值
127.0.0.1:6379> HEXISTS myhash k1(不存在返回0)
(integer) 0
127.0.0.1:6379> HEXISTS myhash k2(存在返回1)
(integer) 1
7.只获取所有的key值/value值:
127.0.0.1:6379> HKEYS myhash(只获取所有的key值)
1) "k2"
2) "k3"
127.0.0.1:6379> HVALS myhash(只获取所有的value值)
1) "v2"
2) "v3"
8.hash中数字的加减操作:HINCRBY hash名称 对应的key值 加减的数值
127.0.0.1:6379> HSET myhash k1 4(hash中放入k1=4)
(integer) 1
127.0.0.1:6379> HGETALL myhash
5) "k1"
6) "4"
127.0.0.1:6379> HINCRBY myhash k1 10(k1数值+10)
(integer) 14
127.0.0.1:6379> HGETALL myhash(k1数值变成了14)
5) "k1"
6) "14"
127.0.0.1:6379> HINCRBY myhash k1 -3(k1数值-3)
(integer) 11
127.0.0.1:6379> HGETALL myhash(k1数值-3)
5) "k1"
6) "11"
9.hash中如果存在则不能设置,不存在可以设置
127.0.0.1:6379> HSETNX myhash k1 14(hash中不存在k1,所以设置成功返回1)
(integer) 1
127.0.0.1:6379> HSETNX myhash k1 10(hash中存在k1,所以设置失败返回0)
(integer) 0
10.hash中存储像对象一样的数据
127.0.0.1:6379> HMSET user:1 name wmd age 19(多个k-v可以同时设置,不用像string那样,每次逗得写user:1)
OK
127.0.0.1:6379> HMGET user:1 name(获取1对象的name值)
1) "wmd"
127.0.0.1:6379> HMGET user:1 age(获取1对象的age值)
1) "19"
Zset(有序集合):参考地址:https://www.cnblogs.com/hunternet/p/12717643.html
有序集合
1.往有序集合中放入值ZADD zset名称 放入的位置 值
127.0.0.1:6379> ZADD myZset 1 wmd(往myZset的第一个位置上添加wmd)
(integer) 1
127.0.0.1:6379> ZADD myZset 2 ld(往myZset的第二个位置上添加ld)
(integer) 1
127.0.0.1:6379> ZRANGE myZset 0 -1(取出myZset的所有值)
1) "wmd"
2) "ld"
127.0.0.1:6379> ZADD myZset 1 wdx(在第一个位置上放入wdx)
(integer) 1
127.0.0.1:6379> ZRANGE myZset 0 -1(获取zset时,发现是有序的)
1) "wdx"
2) "wmd"
3) "ld"
等等等等:参考地址:https://www.cnblogs.com/hunternet/p/12717643.html