Redis 是一个开源(BSD 许可)、内存中数据结构存储,用作数据库、缓存和消息代理。Redis 提供数据结构,如字符串、哈希、列表、集、带范围查询的排序集、位图、超日志、地理空间索引和流。Redis 具有内置的复制、Lua 脚本、LRU 逐出、事务和不同级别的磁盘持久性,并通过 Redis Sentinel 和 Redis Cluster 的自动分区提供高可用性。
切换数据库
Redis中也有数据库的概念,一个数据库可以保存一组数据,每个数据库都有一个id号,默认的数据库id号为0,我们可以通过select来切换到对应的数据库,并且每个数据库都是相互隔离的,即当前数据库的数据在别的数据库上是不存在的,Redis默认有16个数据库
127.0.0.1:6380> keys * #查看数据库0当中的所有key
(empty array)
127.0.0.1:6380> select 7 #切换到第八个数据库
OK
127.0.0.1:6380[7]> keys *
(empty array)
127.0.0.1:6380[7]> set abc abc #添加一个key为abc值为abc的数据
OK
127.0.0.1:6380[7]> keys *
1) "abc"
127.0.0.1:6380[7]> get abc
"abc"
127.0.0.1:6380[7]> select 0 #切换到第一个数据库,发现之前添加的key并没有
OK
127.0.0.1:6380> keys *
(empty array)
String( 字符串 )
#######################################
127.0.0.1:6379> set key1 v1 #设置值
OK
127.0.0.1:6379> get key1 #获取值
"v1"
127.0.0.1:6379> keys * #获取全部的key
1) "key1"
127.0.0.1:6379> exists key1 #判断key为key1是否存在
(integer) 1
127.0.0.1:6379> append key1 "hello" #往key1后面追加内容
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> strlen key1 #获取key的长度
(integer) 7
#######################################
# key自增
# 步长,设置自增大小
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views #自增views,默认为1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views #自减views,默认为1
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incrby views 10 #设置自增的值为10
(integer) 10
127.0.0.1:6379> incrby views 10
(integer) 20
127.0.0.1:6379> decrby views 10 #设置自减的值为10
(integer) 10
127.0.0.1:6379> decrby views 10
(integer) 0
#######################################
#字符串范围 range
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set key1 "hello,zhu"
OK
127.0.0.1:6379> get key1
"hello,zhu"
127.0.0.1:6379> getrange key1 0 3 #相当于java里面的substring,截取字符串[0,3]
"hell"
127.0.0.1:6379> getrange key1 0 -1 #截取全部的字符串
"hello,zhu"
# 替换!
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"
#######################################
# setex(set with expire) #设置过期事件
# setnx(set if not exist) #如果key不存在,就给他赋值,存在的话,就不赋值
127.0.0.1:6379> setex key3 10 "hello" #设置key3的有效时间为10秒
OK
127.0.0.1:6379> ttl key3 #查看key3的有效时间
(integer) 7
127.0.0.1:6379> get key3
(nil)
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> setnx mykey "abc" #如果mykey存在,则创建失败
(integer) 0
127.0.0.1:6379> get mykey
"redis"
#######################################
# mset
# mget
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #设置多个key的值,分别设置k1,k2,k3的值为v1,v2,v3
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
3) "k3"
127.0.0.1:6379> mget k1 k2 k3 #查看k1,k2,k3的值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4 #如果k1不存在就创建赋值,如果k4不存在就创建赋值,如果其中有一个失败就都失败
(integer) 0
127.0.0.1:6379> get k4
(nil)
#对象
set user:1{name:zhangsan,age:3} #设置一个user:1对象 值为json字符保存一个对象
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 18
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "18"
#######################################
#getset 先get在set
127.0.0.1:6379> getset db redis #如果不存在值,就返回null,并设置值,如果有值的话,就返回值,并设置新的值
(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"
String类似的使用场景:value除了是我们的字符串还可以是我们的数字!
-
计数器 -
统计多单位的数量,如:访问量、点赞量等 -
对象缓存存储
List( 列表 )
在redis里面,所有list的命令都是以l
开头的
#######################################
# 默认的list都是以队列来存储数据和取出数据
127.0.0.1:6379> lpush list one #往list里面添加值
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1 #取list所有的值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1 #从list中取下标从0到1的值
1) "three"
2) "two"
127.0.0.1:6379> rpush list right #从list的右边插入数据
(integer) 4
127.0.0.1:6379> lrange list 0 -1 #查看list中所有的值
1) "three"
2) "two"
3) "one"
4) "right"
#######################################
# LPOP #从list列表中删除值
# RPOP
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> lpop list #移除list的第一个元素
"three"
127.0.0.1:6379> rpop list
"right"
127.0.0.1:6379> lrange list 0 -1 #移除list的最后一个元素
1) "two"
2) "one"
#######################################
# Lindex
127.0.0.1:6379> lindex list 1 #通过下标获取list中的某一个值!
"one"
127.0.0.1:6379> lindex list 0
"two"
#######################################
# Llen
127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> llen list #获取list的长度
(integer) 3
#######################################
# 移除指定的值
# Lrem
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 1 one #从list移除指定个数的指定值
(integer) 1
127.0.0.1:6379> lrem list 2 three
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
#######################################
#Ltrim 截取,将指定的list进行区间截断,如果在区间里面就保留,没有在区间里面的就不保留
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpush mylist "hello3"
(integer) 4
127.0.0.1:6379> ltrim mylist 1 2 #保留list里面区间为[1,2]的值
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"
#######################################
#rpoplpush 将列表的最右边的值删除,并将删除的值添加到新的list中
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"
127.0.0.1:6379> rpoplpush mylist newlist #将列表的最右边的值删除,并将删除的值添加到新的list中
"hello2"
127.0.0.1:6379> lrange mylist 0 -1 #查看原来列表的值
1) "hello1"
127.0.0.1:6379> lrange newlist 0 -1 #查看目标列表中的值
1) "hello2"
#######################################
# Lset 将列表中指定下标的值进行更改
127.0.0.1:6379> exists list #判断这个列表是否存在
(integer) 0
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
127.0.0.1:6379> lset mylist 0 item #将该列表中下标为0的值更改为item
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "item"
127.0.0.1:6379> lset mylist 1 abc #如果下标中的值不存在地话,就会提示错误
(error) ERR index out of range
#######################################
# Linsert 将某一个具体的value插入中列表中某个元素的前面或者后面,如果一个list里面有多个重复的值的话,它只会第一个找到的值的前面或者后面插入值
127.0.0.1:6379> lrange mylist 0 -1
1) "for"
2) "item"
127.0.0.1:6379> linsert mylist before item new
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "for"
2) "new"
3) "item"
127.0.0.1:6379> linsert mylist after item check
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "for"
2) "new"
3) "item"
4) "check"
小结
-
他实际上是一个链表,before Node after , left , right 都可以插入值 -
如果key不存在,创建新的链表 -
如果key存在 -
新增内容 -
如果移除了所有值,空链表,也代表不存在! -
在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点
Set( 集合 )
Set集合中的值是不能重复的!
#######################################
127.0.0.1:6379> sadd myset one #往set集合中添加元素
(integer) 1
127.0.0.1:6379> sadd myset two
(integer) 1
127.0.0.1:6379> sadd myset three
(integer) 1
127.0.0.1:6379> smembers myset #查看set集合中所有的元素
1) "two"
2) "three"
3) "one"
127.0.0.1:6379> sismember myset one #判断set集合中是否包含指定的元素,如果有,则返回1,如果没有,则返回0
(integer) 1
127.0.0.1:6379> sismember myset three
(integer) 1
127.0.0.1:6379> sismember myset four
(integer) 0
#######################################
# scard 获取set集合中的元素个数
127.0.0.1:6379> scard myset
(integer) 3
#######################################
# srem 移除set集合中的指定元素
127.0.0.1:6379> srem myset three
(integer) 1
127.0.0.1:6379> scard myset
(integer) 2
127.0.0.1:6379> smembers myset
1) "two"
2) "one"
#######################################
# srandmember 随机抽选set集合中的元素
127.0.0.1:6379> sadd myset three
(integer) 1
127.0.0.1:6379> srandmember myset
"three"
127.0.0.1:6379> srandmember myset
"two"
127.0.0.1:6379> srandmember myset
"one"
127.0.0.1:6379> srandmember myset 2 #随机抽选出x个set集合中的元素
1) "two"
2) "one"
#######################################
# spop 随机删除set集合中的元素
127.0.0.1:6379> spop myset
"one"
127.0.0.1:6379> spop myset
"three"
#######################################
# smove 将一个指定的值,移动到一个另外的set集合中
127.0.0.1:6379> smembers myset
1) "two"
127.0.0.1:6379> sadd myset one
(integer) 1
127.0.0.1:6379> scard myset
(integer) 2
127.0.0.1:6379> sadd myset2 abc
(integer) 1
127.0.0.1:6379> smembers myset2
1) "abc"
127.0.0.1:6379> smove myset myset2 one #将myset集合中的one元素移动到myset2集合中
(integer) 1
127.0.0.1:6379> smembers myset
1) "two"
127.0.0.1:6379> smembers myset2
1) "abc"
2) "one"
#######################################
数字集合类
- 差集 # sdiff
- 交集 # sinter
- 并集 # sunion
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b
(integer) 1
127.0.0.1:6379> sadd key1 c
(integer) 1
127.0.0.1:6379> sadd key2 c
(integer) 1
127.0.0.1:6379> sadd key2 d
(integer) 1
127.0.0.1:6379> sadd key2 e
(integer) 1
127.0.0.1:6379> sdiff key1 key2 #差集
1) "b"
2) "a"
127.0.0.1:6379> sinter key1 key2 #交集
1) "c"
127.0.0.1:6379> sunion key1 key2 #并集
1) "a"
2) "c"
3) "b"
4) "d"
5) "e"
#######################################
共同好友就可以用set集合来实现,因为元素不能重复
Hash( 哈希 )
redis中用key来存储map,然后这个key又有自己的key和value
#######################################
127.0.0.1:6379> hset myhash field1 zhu #给map集合set一个具体的value
(integer) 1
127.0.0.1:6379> hget myhash field1 #获取一个字段值
"zhu"
127.0.0.1:6379> hmset myhash field1 xiaozhu field2 hello #set多个value
OK
127.0.0.1:6379> hmget myhash field1 field2 #获取多个字段值
1) "xiaozhu"
2) "hello"
127.0.0.1:6379> hgetall myhash #获取全部的key和value
1) "field1"
2) "xiaozhu"
3) "field2"
4) "hello"
#######################################
# hdel 删除hash指定的key字段!对应的value值也没有了
127.0.0.1:6379> hdel myhash field2
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "xiaozhu"
#######################################
# hlen 获取hash的长度
127.0.0.1:6379> hlen myhash #获取hash表的字段数量
(integer) 2
#######################################
# hexists 判断hash中指定的字段是否存在
127.0.0.1:6379> hexists myhash field1
(integer) 1
127.0.0.1:6379> hexists myhash field3
(integer) 0
#######################################
# hkeys 只获得所有的key
# hvals 只获得所有的value
127.0.0.1:6379> hkeys myhash
1) "field1"
2) "hello"
127.0.0.1:6379> hvals myhash
1) "xiaozhu"
2) "word"
#######################################
# incr 自增
# decr 自减
127.0.0.1:6379> hset myhash field3 5 #自定义增量!
(integer) 1
127.0.0.1:6379> hincrby myhash fields3 5
(integer) 5
127.0.0.1:6379> hincrby myhash fields3 -1
(integer) 4
127.0.0.1:6379> hsetnx myhash field4 bi #如果myhash中没有field4就可以设置值
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 ab #如果存在就不能设置值
(integer) 0
#######################################
Zset( 有序集合 )
在set集合的基础上,set k1 v1,zset k1 score v1
#######################################
127.0.0.1:6379> zadd myset 1 one #将值插入到zset集合中
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three
(integer) 2
127.0.0.1:6379> zrange myset 0 -1 #显示zset集合中所有的元素
1) "one"
2) "two"
3) "three"
#######################################
#排序 zrangebyscore key min max 升序排列
#排序 zrevrange key start stop 降序排列
127.0.0.1:6379> zadd salary 500 zhu
(integer) 1
127.0.0.1:6379> zadd salary 1500 liang
(integer) 1
127.0.0.1:6379> zadd salary 5000 he
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "zhu"
2) "liang"
3) "he"
127.0.0.1:6379> zrangebyscore salary -inf +inf #对salary集合进行从小到大的排序,不显示成绩
1) "zhu"
2) "liang"
3) "he"
127.0.0.1:6379> zrevrange salary 0 -1 #对salary集合进行从大到小的排序,不显示成绩(降序)
1) "liang"
2) "zhu"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores #对salary集合进行从小到大的排序,显示成绩
1) "zhu"
2) "500"
3) "liang"
4) "1500"
5) "he"
6) "5000"
127.0.0.1:6379> zrangebyscore salary -inf 1500 withscores #对salary集合进行从小到大的排序,显示1500一下的成绩
1) "zhu"
2) "500"
3) "liang"
4) "1500"
#######################################
# zrem 移除zset集合中的元素
127.0.0.1:6379> zrange salary 0 -1
1) "zhu"
2) "liang"
3) "he"
127.0.0.1:6379> zrem salary he #将he元素从zset集合中移除
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "zhu"
2) "liang"
127.0.0.1:6379> zcard salary #获取有序集合中的个数
(integer) 2
#######################################
# zcount 获取指定区间的成员数量
127.0.0.1:6379> zrange myset 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> zcount myset 1 3 #获取1到3区间的成员数量
(integer) 3
127.0.0.1:6379> zcount myset 1 2 #获取1到2区间的成员数量
(integer) 2
#######################################
#######################################
有序集合的底层数据结构是跳跃链表
原文始发于微信公众号(爱吃薯片):Redis五大数据类型
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/26008.html