Redis5大数据类型详解
Posted 略懂Java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis5大数据类型详解相关的知识,希望对你有一定的参考价值。
Redsi快速入门
Redis官网:https://redis.io
Redis中文网:http://www.redis.cn
Redis源码地址:https://github.com/antirez/redis
NoSQL(Not Only SQL)
-
关系型数据库(mysql、Oracle、DB2)
- 结构化数据 :使用关系型数据库表示和存储,表现形式就是二维行列结构;
-
NoSQL:非系型数据库 存储非结构化和半结构化数据
-
非结构化数据 :没有固定存储结构,文件、图片、音视频等
-
半结构化数据 :可以认为是结构化数据的一种,只不过不是以二维行列形式存储,但是数据包含相关标记,比如JSON、xml
-
NoSQL数据库类型
-
键值对数据库(Key-Value数据库)
- 代表数据库:Redis、Memcached
-
列式数据库
- 代表数据库:谷歌的BigTable、Apache的HBase
-
文档数据库
- 这种数据库存储半结构化数据:一般存储为json格式,这种数据库更接近关系型数据库;代表数据库: MongoDB 、 ElasticSearch(ES)
-
图数据库
-
并不是存储图片,而是存储数据间关系,适合做社交网络、关系图谱
-
代表数据库: Neo4J 、 OrientDB
-
Redis是什么?
redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。Redis是纯内存操作,具备很高的读写性能;读的速度能达到110000次/s,写的速度能达到81000次/s。
Redis 能做什么?
缓存、排行榜、计数器(统计浏览量等)、限速器、好友关系(点赞/好友推荐/共同好友)、简单的消息队列、session 服务器等。
centos7安装Redis
安装Development Tools
yum groupinstall -y "Development Tools"
上传安装包 redis-5.0.4.tar.gz 到Centos并解压
tar -zxf redis-5.0.4.tar.gz -C /opt
进入Redis安装目录开始安装
make
cd src/
make install
修改配置文件( redis.conf )
bind 127.0.0.1 注释这一行
protected-mode no (将保护模式修改为no)
daemonize yes (设置为守护进程,把no改为yes)
启动redis server
redis-server mtconfig/redis.conf
启动redis-cli客户端
redis-cli -p 6379
输入ping显示pong代表成功
停止redis服务
redis-cli shutdown
Redis的多数据库特点
-
不支持自定义数据库名称。不支持为每个数据库设置访问密码。
-
多个数据库之间不是完全隔离的,FLUSHALL命令会清空所有数据库的数
据。 -
多数据库不适用存储不同应用的数据。
-
Redis集群不支持多数据库。
-
Redis默认支持 16个数据库 ,以一个从0开始的递增数字命名,可以通过redis.conf中的 databases 配置。
-
客户端连接Redis服务器后会自动选择0号数据库,可以通过 SELECT 数据库id
更换数据库,例如选择15号数据库。
select 15
Redis常用的全局命令
#查看所有的键,支持通配符查询,如: keys name*
keys *
#测试是否存在指定的key,存在返回1,不存在返回0
exists key
#查看key的剩余有效时间, -1 代表永不过期, -2 表示key已经过期
ttl key
expire key seconds #设置key的过期时间,单位是秒
#删除某个key
del key
#修改key的名称
rename key newkey
#清空所有数据(会跨库清空数据)
flushall
#查看数据信息,info Server,info CPU、info Replication
info [section]
#取消key的过期时间
persist key
String类型
string类型是redis中最基本的类型,并且是二进制的安全的,可以存储序列化的对象、
二进制图片、一个简单的字符串、数值等。一个字符串类型的键允许存储的数据最大容量是512MB。特别注意: mset 、 mget 在集群环境下无法使用。
1. set命令
作用:赋值;
格式:set key value [expiration EX seconds|PX milliseconds] [NX|XX]
EX seconds -- Set the specified expire time, in seconds.
PX milliseconds -- Set the specified expire time, in milliseconds.
NX -- Only set the key if it does not already exist.
XX -- Only set the key if it already exist.
1.1 举例
127.0.0.1:6379> set name etoak
OK
1.2 设置age为10,5秒后失效
127.0.0.1:6379> set age 10 ex 5
OK
127.0.0.1:6379> get age
"10"
127.0.0.1:6379> get age
(nil)
1.3 为一个存在的key设置值
127.0.0.1:6379> set name et1810 xx
OK
127.0.0.1:6379> get name
"et1810"
1.4 如最后加上xx,给一个不存在key(adress)设值,返回nil
127.0.0.1:6379> set address et1810 xx
(nil)
1.5 为一个不存在的key设值
127.0.0.1:6379> set address bao_tu_quan_bei_lu nx
OK
127.0.0.1:6379> get address
"bao_tu_qian_bei_lu"
1.6 若最后加上nx,给一个存在的key(name)设值,返回nil
127.0.0.1:6379> set name et nx
(nil)
2. get命令
作用:获取指定key的值
格式:get key
举例
127.0.0.1:6379> get name
3. setnx命令
作用:当设置的key不存在时则进行设置;若key不存在,返回1;存在,返回0;
格式:setnx key value
举例
127.0.0.1:6379> setnx key1 1
(integer) 1
# 由于key1已经设置,所以再次设置就失败返回了0
127.0.0.1:6379> setnx key1 1
(integer) 0
4. setex
#作用:设置key的有效时间;key失效后返回nil;
#格式:setex key seconds value
#举例
# 设置key1的值为2,失效时间是5秒
127.0.0.1:6379> setex key1 5 2
OK
127.0.0.1:6379> get key1
"2"
# 5秒后返回nil
127.0.0.1:6379> get key1
(nil)
5. setrange
#作用:替换字符串;
#格式:setrange key offset value
# offset:从哪个位置开始替换,起始位置是0;
#举例
127.0.0.1:6379> set email luxilejn@163.com
OK
127.0.0.1:6379> setrange email 9 126.com
(integer) 16
127.0.0.1:6379> get email
"luxilejn@126.com"
6. getrange
#作用:获取字符串;
#格式:getrange key start end
# start:开始下标
# end:结束下标
#说明:左边起始下标是0,右边起始下标是-1
#举例
127.0.0.1:6379> getrange email 0 -1 获取整个字符串
"luxilejn@126.com"
127.0.0.1:6379> getrange email 0 7
"luxilejn"
127.0.0.1:6379> getrange email 9 -1
"126.com"
127.0.0.1:6379> getrange email -3 -1
"com"
7. mset
#作用:一次为多个key赋值;
#格式:mset key value [key value ...]
#举例
127.0.0.1:6379> mset key1 hello key2 world
OK
127.0.0.1:6379> get key1
"hello"
127.0.0.1:6379> get key2
"world"
8. mget
#作用:一次获取key赋值;
#格式:mget key [key ...]
#举例
127.0.0.1:6379> mset key1 hello key2 world
OK
127.0.0.1:6379> mget key1 key2
1) "hello"
2) "world"
9. msetnx
#作用:一次为多个不存在的key设置值,成功返回1,表示所有的值都设置了;
# 失败返回0,表示没有任何值被设置,但是不会覆盖已经存在的 key。
#MSETNX is atomic, so all given keys are set at once.
#格式:msetnx key value [key value ...]
#举例
# key3和key4都不存在,所以设置成功,返回1
127.0.0.1:6379> msetnx key3 3 key4 4
(integer) 1
127.0.0.1:6379> mget key3 key4
1) "3"
2) "4"
# 此时key4已经存在,所以设置失败,返回0
127.0.0.1:6379> msetnx key5 5 key4 6
(integer) 0
127.0.0.1:6379> mget key5 key4
1) (nil)
2) "4"
10. getset
# 作用:设置key的值,并返回key的旧值;
# 格式:getset key value
#举例
127.0.0.1:6379> set name et1810
OK
127.0.0.1:6379> getset name etoaker
"et1810"
11. incr
#作用:对key的值做加加操作,并返回新的值。
# 如果incr一个不是int类型value的key会返回错误,incr一个不存在的 key,则设置key为1;
#格式:incr key
#举例
127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> incr age
(integer) 11
# incr一个不存的key,返回1
127.0.0.1:6379> incr count
(integer) 1
127.0.0.1:6379> get count
"1"
12.decr
#作用:对key的值做的是减减操作;如果decr一个不存在key,则设置key为-1
#格式:decr key
#举例
127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> decr age
(integer) 9
127.0.0.1:6379> decr length decr一个不存的key,返回-1
(integer) -1
127.0.0.1:6379> get length
"-1
13. incrby
#作用:与incr类似,给定值相加;
# 若key不存在,会设置 key的值为给定的值(Redis认为不存在的key的value是0);
#格式:incrby key increment
#举例
127.0.0.1:6379> incrby age 10
(integer) 19
127.0.0.1:6379> incrby a 10 为不存在的a加10
(integer) 10
14. decrby
#作用:与decr类似,减去给定的值。
#格式:decrby key decrement
#举例
127.0.0.1:6379> set age 100
OK
127.0.0.1:6379> decrby age 10
(integer) 90
127.0.0.1:6379> decrby count 10 count不存在
(integer) -10
15. append
#作用:为指定的key的值追加value,返回新字符串值的长度。
#格式:append key value
#举例
127.0.0.1:6379> set email et1810
OK
127.0.0.1:6379> append email @etoak.com
(integer) 16
127.0.0.1:6379> get email
et1810@etoak.com
127.0.0.1:6379> append age 99
(integer) 4
127.0.0.1:6379> get age
"9099"
16. strlen
#作用:得到key对应value值的长度;
#格式:strlen key
#举例
127.0.0.1:6379> set name etoaker
OK
127.0.0.1:6379> strlen name
(integer) 7
hash类型
hash是一个string类型的field和value的映射表。特别适合存储对象,将一个对象存储
在hash类型中会占用更少的内存,而且可以方便的操作对象
1.hset
#作用:设置hash类型值;
#格式:hset key field value
#举例
127.0.0.1:6379> hset user name etoaker
(integer) 1
127.0.0.1:6379> hset user age 100
(integer) 1
127.0.0.1:6379> hget user name
"etoaker"
2. hget
#作用:获取hash类型某个key下的某个field的值
#格式:hget key field
#举例
127.0.0.1:6379> hset user age 100
(integer) 1
127.0.0.1:6379> hget user age
"100"
3. hsetnx
#作用:如果key对应的field不存在,则赋值,存在时什么都不做。
#格式:hsetnx key field value
#举例
# 对一个不存在field设置值
127.0.0.1:6379> hsetnx user address ji_nan
(integer) 1
127.0.0.1:6379> hget user address
"ji_nan"
# 对一个已存在的field设置值
127.0.0.1:6379> hset user name et1810
(integer) 0
127.0.0.1:6379> hget user name
"et1810"
127.0.0.1:6379> hsetnx user name etoak
(integer) 0
127.0.0.1:6379> hget user name
"et1810"
4. hmset
#作用:同时为一个key的设置多个field;
#格式:hmset key field value [field value ...]
#举例
127.0.0.1:6379> hmset user name et1810 age 100 address ji_nan
OK
5. hmget
#作用:同时获取一个key的多个field的值;
#格式:hmget key field [field ...]
#举例
127.0.0.1:6379> hmget user name age address
1) "et1810"
2) "100"
3) "ji_nan"
6. hgetall
#作用:获取一个key下所有field和value
#格式:hgetall key
#举例
127.0.0.1:6379> hgetall user
1) "name"
2) "et1810"
3) "age"
4) "100"
5) "address"
6) "ji_nan"
7. hkeys
#作用:获取key对应的所有的field
#格式:hkeys key
#举例
127.0.0.1:6379> hkeys user
1) "age"
2) "nage"
8. hvals
#作用:获取key对应的所有value;
#格式:hvals key
#举例
127.0.0.1:6379> hvals user
1) "200"
2) "etoak"
9. hincrby
# 作用:增减数值
# 格式:hincrby key field increment
# 举例
127.0.0.1:6379> hincrby user age 100
(integer) 200
127.0.0.1:6379> hget user age
"200"
10. hdel
#作用:删除key对应的filed的值,field可以写多个
#格式:hdel key field [field ...]
#举例
127.0.0.1:6379> hdel user name address
(integer) 2
127.0.0.1:6379> hgetall user
1) "age"
2) "200"
11. hlen
#作用:返回指定key的field数量。
#格式:hlen key
#举例
127.0.0.1:6379> hlen user
(integer) 2
12. hexists
#作用:测试给定key下的field是否存在。
#格式:hexists key field
#举例
127.0.0.1:6379> hexists user age
(integer) 1
# 表示不存在
127.0.0.1:6379> hexists user pic
(integer) 0
list类型
list是一个链表结构,类似JDK的LinkedList、Queue,主要功能是push、pop、获取一
个范围的所有值等等,key可以认为链表的名称。list类型的每个子元素都是string类型的双向链表,可以通过push、pop从链表的头部或者尾部添加、删除元素;
1. lpush
从头部(链表左侧)添加元素
2. lpop
从list头部获取元素
3. rpush
从尾部(链表右侧)添加元素
4. rpop
从list尾部获取元素
5. lrange
查看list的所有元素:lrange list名称 0 -1
6. linsert
在某个元素的前后插入元素
格式:linsert list before/after 原有元素 新元素
7. lrem
移除元素 lrem list 2(移除个数) “key”
8. rpoplpush
从源list的尾部删除元素,并将其插入到新的list的头部
rpoplpush 源list 目标list
9. lindex
返回指定索引的值
格式:lindex key index
index下标是从0开始的
10.llen
返回list的元素个数
实现栈
lpush和lpop可以实现栈结构(先进后出)
rpush和rpop实现栈结构(先进后出)
实现队列
lpush和rpop可以实现队列(先进先出)
rpush和lpop实现队列结构(先进先出)
Set
set是string类型的无序不可重复的集合。Set是通过hash table实现的,添加、删除和查
1.add
作用:添加元素
格式:SADD key member [member ...]
2. smembers
作用:获取集合中所有元素
格式:smembers key
3. sismember
作用:判断元素是否在集合中;如果元素在集合中,则返回1;如否,那么返回0
格式:sismember key member
4.srem
作用:删除元素
格式:srem key member [member ...]
5. scard
作用:获取元素个数,相当于count
格式:scard key
6.spop
作用:随机返回删除的元素
格式:spop key [count]
7. sdiff
作用:差集,返回在第一个set里面 而不在后面任何一个set里面的项(谁在前以谁为标准)
格式:sdiff key [key ...]
8. sdiffstore
作用:差集并保留结果
格式:sdiffstore destination key [key ...]
9. sinter
作用:交集,返回多个set里面都有的项
格式:sinter key [key ...]
10. sinterstore
作用:交集并保留结果
格式:sinterstore destination key [key ...]
11. sunion
作用:并集
格式:sunion key [key ...]
12. sunionstore
作用:并集并保留结果
格式:sunionstore destination key [key ...]
13. smove
作用:移动元素到另一个集合
格式:smove source destination member
zset类型
zset有序集合,类似SortedSet。
1. zadd
作用:添加元素;
格式:zadd key score value [score value]
2. zrange
作用:获取索引区间内的元素;(升序)
格式:zrange key start stop [withscores]
2. zrevrange
作用:获取索引区间内的元素;(降序)
格式:zrevrange key start stop [withscores]
3. zrangebyscore
#作用:获取分数区间内的元素;
#格式:zrangebyscore key minscore maxscore [withscore] [limit offset count]
#默认是包含端点值的,如果加上"("表示不包含,后面还可以加上limit来限制。
# - 举例1:
zrangebyscore set 100 400 获取set中"大于等于100","小于等于400"的元素列表
# - 举例2:
zrangebyscore set (100 (400 获取set中"大于100","小于400"的元素列表
# - 举例3:
zrangebyscore set1 (100 (400 withscore limit 0 4
4. zrem
作用:删除元素
格式:zrem key member [member]
以上是关于Redis5大数据类型详解的主要内容,如果未能解决你的问题,请参考以下文章