Redis中常用的六种数据类型(key与五种数据类型
Redis中常用的六种数据类型(key与五种数据类型)
使用 select 索引 来切换数据库:select 5
String(字符串)
在redis中字符串的类型是安全的二进制类型,并且字符串的value
的最法制是512M,那就意味着 String类型并不是只能单单存储一个简单的字符串,也可以存储图片或者文件的序列化对象,字符串类型采用类似arraylist采用扩容机制
-
set key value 存储一个字符串到redis中
127.0.0.1:6379[2]> set name hanhan OK
-
get key 从redis中取值
127.0.0.1:6379[2]> get name "hanhan"
-
append key value 可以将内容追加到之前的key上 如果不存在则会创建key并存储
127.0.0.1:6379[2]> append name add (integer) 9 127.0.0.1:6379[2]> get name "hanhanadd"
-
strlen name 获得value占用的字节数(一个中文占3个字节)
127.0.0.1:6379[2]> strlen name (integer) 9
-
incr key key对应的value必须是数字类型 否则会抛出异常 作用为如果key存在则让值进行自增1的操作,不存在则创建key的值为1
127.0.0.1:6379[2]> set number 10 OK 127.0.0.1:6379[2]> incr number (integer) 11 127.0.0.1:6379[2]> get number "11"
-
decr key 与incr相反进行的是-1的操作
127.0.0.1:6379[2]> decr number (integer) 10 127.0.0.1:6379[2]> get number "10"
-
incrby / decrby key 步长 与incr / decr 的作用类似 但是不是自增1而是根据指定的步长进行自增以及自减操作
127.0.0.1:6379[2]> incrby number 5 (integer) 15 127.0.0.1:6379[2]> decrby number 10 (integer) 5
-
mset key value key value…
一次存储多个key value127.0.0.1:6379[2]> mset age 18 sex n status 1 OK 127.0.0.1:6379[2]> keys * 1) "number" 2) "sex" 3) "name" 4) "status" 5) "age"
-
mget key key… 一次获取多个值
127.0.0.1:6379[2]> mget number sex name age 1) "5" 2) "n" 3) "hanhanadd" 4) "18"
Redis的原子性:一次存储多个key value 与多次存储多个key value有什么区别?
原子性是不可风分割的的组织,redis中的单条命令能够完成的操作,全部都是原子性的,因为Redis是单线程的,所以Redis在执行一条命令的途中不会被其他线程打断,也不会被切换但其他线程,而如果是多条命令的话,则不会具备原子性(也就是指
mset id 1 name 憨憨 age 19 这个操作是一条命令,不会被其他线程打断
set id 1 set name 憨憨 set age 19 这个操作是三条命令。中间可能被其他线程打断)
-
msetnx key value key value…
一次存储多个key value 要么都成功 要么都失败
-
getrange key 起始下标 到此下标结束
截取字符串 从起始下标取到结束下标,然后将值返回
127.0.0.1:6379[2]> get name "hanhanadd" 127.0.0.1:6379[2]> getrange name 1 3 "anh"
-
setrange key 起始下标 value
从起始下标开始 替换对应的value位数的值
127.0.0.1:6379[2]> setrange name 1 name (integer) 9 127.0.0.1:6379[2]> get name "hnamenadd"
-
setx key 过期时间 value 在设置key的同时 设置他的过期时间
127.0.0.1:6379[2]> setex h 5 end OK 127.0.0.1:6379[2]> get h "end" 127.0.0.1:6379[2]> get h (nil)
-
getset key 先获取原本的值 再替换原本key的值
127.0.0.1:6379[2]> getset status new "1" 127.0.0.1:6379[2]> get status "new"
-
psetex key 过期时间 value 在设置key的同时 设置值他的过期时间是多少毫秒
127.0.0.1:6379[2]> psetex g 6000 123 OK 127.0.0.1:6379[2]> get g "123" 127.0.0.1:6379[2]> get g (nil)
-
exists key 用于判断key是否存在 存在返回1 不存在返回0
127.0.0.1:6379[2]> exists name (integer) 1
-
setnx key valu
如果kay存在则不做任何操作(操作失败) 如果key不存在则新增key,value操作成功返回1 此操作失败返回0
127.0.0.1:6379[2]> setnx name 12 (integer) 0
List(列表)
list 底层是双向链表,对于数据两端的数据操作效率要高,如果根据索引操控中间的数据小路较低,如果链表中存在上下引用,如果链表中只是单纯的存储数字类型的数据的话,会造成数据浪费
-
lpush / rpush key value …
从左侧或者右侧插入值,如果key不存在则创建key,并返回值的个数
127.0.0.1:6379[2]> lpush list lalala (integer) 1 127.0.0.1:6379[2]> rpush lists hahaha (integer) 1
-
lpop/rpop key
从左侧或者右侧从list中取出一个值
127.0.0.1:6379[2]> lpop list "lalala" 127.0.0.1:6379[2]> rpop lists "hahaha"
-
rpoplpush key key
从第一个key的右侧拿出来一个值,放入到第二个集合的左侧
127.0.0.1:6379[2]> rpoplpush llist list "5"
-
lrange key 起始下标 结束下标
根据下标进行范围取值 -1代表最后一个下标,此操作值还在list中
127.0.0.1:6379[2]> lrange llist 0 -1 1) "1" 2) "2" 3) "4"
-
lindex key 下标
根据下标从list左侧取值
127.0.0.1:6379[2]> lindex llist 1 "2"
-
llen key
获取list长度
127.0.0.1:6379[2]> llen llist (integer) 3
-
linsert key before|after value newvalue
在value的前面或后面插入newvalue
127.0.0.1:6379[2]> linsert llist before 2 new (integer) 4 127.0.0.1:6379[2]> lrange llist 0 -1 1) "1" 2) "new" 3) "2" 4) "4"
-
lrem key 个数 value
从集合的左侧删除指定个数的value值,然后返回删除掉的个数
127.0.0.1:6379[2]> lrem llist 2 new (integer) 1
-
lset kay 下标 value
将list中下标的值修改为value
127.0.0.1:6379[2]> lrange llist 0 -1 1) "1" 2) "2" 3) "4"
set(集合)
类似于java中的set,实际上也是提供跟set类似的功能,但是里面有自动排重的功能,并且没有索引,也就是指set中的值不能重复,当我们需要使用集合来存储数据,如果书有重复的内容,就采用list存储,如果数据中不准出现重复的内容就采用set存储,set的底层实际上就是key value形式的存储
-
sadd key value…
存储数据,如果数据重复则会直接忽略掉value
127.0.0.1:6379[2]> sadd shuzi 1 2 3 4 4 5 (integer) 5
-
smembers key
取出集合中所有的值 不会删除
127.0.0.1:6379[2]> smembers shuzi 1) "1" 2) "2" 3) "3" 4) "4" 5) "5"
-
scard key
返回集合中元素的个数
127.0.0.1:6379[2]> scard shuzi (integer) 5
-
srem key value…
删除集合中的value,并返回删除的个数
127.0.0.1:6379[2]> srem shuzi 1 2 (integer) 2
-
spop key [个数]
从集合中随机拿走一个或者多个值(值会被删除)
127.0.0.1:6379[2]> spop shuzi 2 1) "3" 2) "5"
-
srandmember key [个数]
从集合中随机取出一个或多个值(值不会被删除)
127.0.0.1:6379[2]> srandmember sets 5 1) "4" 2) "3" 3) "2" 4) "8" 5) "0"
-
smove key 1 key 2
将key1中的value拿走放入到key2中
127.0.0.1:6379[2]> smove shuzi sets 2 (integer) 0
-
sinter key1 key2 value
返回两个集合中重复的元素
127.0.0.1:6379[2]> sinter shuzi sets 1) "2" 2) "4"
-
sunion key1 key2
返回集合中所有的元素(重复的指挥显示一个)
127.0.0.1:6379[2]> sunion sets shuzi 1) "0" 2) "1" 3) "2" 4) "3" 5) "4" 6) "5" 7) "6" 8) "7" 9) "8" 10) "9" 11) "21" 12) "22"
-
sdiff key1 key2
返回key2中没有的key1元素
127.0.0.1:6379[2]> sdiff shuzi sets 1) "21" 2) "22"
-
sismember key value
判断key中是否存在value,如果存在返回1 否则返回0
127.0.0.1:6379[2]> sismember stes 22 (integer) 0
zset
zset有序集合和set无序集合很像,两者都是不能有重复元素,不同的是zset里面有自己的排序规则,所以zset是有序的(这个顺序并不是我们存储的顺序,而是按照我们在存储数据的时候我们给的score来排序)
-
zadd key score value…
添加元素 按照一个score 一个value的方式添加
127.0.0.1:6379[2]> zadd zsets 1 name 2 age 3 apple (integer) 3
-
zrange key 起始score 结束score [withscores]
返回key里面两个score之间的值包括
127.0.0.1:6379[2]> zrange zsets 1 4 1) "age" 2) "apple"
-
zrangebyscore key 起始score 结束score
按照score的顺序取出范围内的值,升序输出
127.0.0.1:6379[2]> zrangebyscore zsets 1 4 1) "name" 2) "age" 3) "apple"
-
zrevrangebyscore key 起始score 结束score
按照score的顺序取出范围内的值,降序输出
127.0.0.1:6379[2]> zrevrangebyscore zsets 4 1 1) "apple" 2) "age" 3) "name"
-
zincrby key i value
将key中value的score增加i的值
127.0.0.1:6379[2]> zincrby zsets 2 apple "5"
-
zrank key value
查看value在key中排第几个(从0开始)
127.0.0.1:6379[2]> zrank zsets apple (integer) 2
-
zcount key 起始score 结束score
查询key的score范围内有多少个元素
127.0.0.1:6379[2]> zcount zsets 1 3 (integer) 2
-
zrem key value…
删除key的value
127.0.0.1:6379[2]> zrem zsets apple (integer) 1
hsah(键值对集合)
hash是一个键值对集合 类似于java中的map hash 结构,非常方便我们的单个java对象
对象由对象如下: user id=1 name=憨憨 sex=女 age=19
如果我们用string来存储上面的 user的话,需要将对象序列化存入到redis,如果我们想修改对象的某个属性,我们需要将整个user都需要反序列化修改age=20 再次将user序列化存入到redis,在修改数据的时候需要反复序列化增加开销。
如果过我们使用hash 来存储:
key 1 value Field value
1_id 1
1_name 憨憨
1_sex 女
1_age 18
我们只需要通过用户id+属性名称取修改对应的值就行了,不需要反复序列化以及存储数据,节省开销。
-
hset key field value
根据键值对的形式向key中添加值
127.0.0.1:6379[2]> hset hsets name lalala (integer) 1
-
hget key field
根据key以及属性名取出对应的value
127.0.0.1:6379[2]> hget hsets name "lalala"
-
hexists key field
判断key中是否存在属性,如果存在返回1 不存在返回0
127.0.0.1:6379[2]> hexists hsets name (integer) 1
-
hkeys key
取出所有的key
127.0.0.1:6379[2]> hkeys hsets 1) "name" 2) "age" 3) "number"
-
hvals key
取出所有的value
127.0.0.1:6379[2]> hvals hsets 1) "lalala" 2) "12" 3) "aa"
-
hincrby key 属性 正负值
对属性的值进行加减操作
127.0.0.1:6379[2]> hincrby hsets age 2 (integer) 14
-
hsetnx key 属性 值
当属性不存在的时候,添加属性以及值,如果属性存在则不进行任何操作
127.0.0.1:6379[2]> hsetnx hsets hh 123 (integer) 1
key
key
Redis中最关键的东西,所有的操作都是通过key来完成的
-
**keys ***
获取所的key
127.0.0.1:6379[2]> keys * 1) "number" 2) "name" ...
-
exits key
判断key是否存在
127.0.0.1:6379[2]> exists name (integer) 1
-
type key
查询key的类型
127.0.0.1:6379[2]> type number string
-
del key
删除指定的key,需要注意的是key中由一些特殊字符需要将key引起来
127.0.0.1:6379[2]> del name (integer) 1
-
unlink key
异步删除key
127.0.0.1:6379[2]> unlink age (integer) 1
-
expire key seconds
给key设置过期时间(单位秒)
127.0.0.1:6379[2]> expire sex 5 (integer) 1 127.0.0.1:6379[2]> get sex "n" 127.0.0.1:6379[2]> get sex (nil)
-
ttl key
查询剩余过期时间 -2代表已删除 -1 代表永久有效
127.0.0.1:6379[2]> ttl sex (integer) -2
-
dbsize key
查看数据库数量
127.0.0.1:6379[2]> ttl sex (integer) -2
-
flushdb
清空当前数据库
127.0.0.1:6379[2]> flushdb OK 127.0.0.1:6379[2]> dbsize (integer) 0
-
flushshall
清空所有数据库
127.0.0.1:6379[2]> flushall OK