一、字符串类型
在redis里面有一个特别重要的命令“keys”,可以进行全部数据的列出。
1.设置新的数据:
set username-dlnu hello;
2.取得对应的数据:
get username-dlnu;
.如果在进行数据查询的时候没有对应的key的内容,则返回的是“nil”。
.在数据取得的时候没有"*"的通配符,只有"keys"的命令才提供这个操作。
3.清空仓库
flushdb;
4 .不覆盖设置内容
set username-dlnu hello;
set username-dlnu huting;
#直接这样set值,后面的huting就会覆盖之前的hello,有时候显然我们不是这样想的。所有这里有setnx这个指令
#按照下面操作就不会不覆盖,并且会有返回值为"1"
setnx username-dlnu hello;
setnx username-dlnu huting;
#注意了,当初先下面这种操作,返回值就为"0"了
setnx username-dlnu hello;
setnx username-dlnu hello;
5.设置数据的有效时间(在开发中经常用到:比如短信验证码场景)
#命令
setex 110-code 10 8989
#上述命令设置的内容在10秒后就会自动销毁
#在实际应用中验证码的信息保存就使用了此类型数据,
#在某一个key具备指定的有效时间之后实际上可以用 ttl key来查看剩余的有效时间,如果时间还没有失效返回正常剩余的时间,如果时间失效了,则返回"-2";
#在有效时间内,我们也可以取消数据的有效时间,使用命令peisist key ,效果就是查看剩余时间时候返回的是"-1",但是数据仍然在,不会返回"nil"
6.设置多个值
mset username-huting goodboy username-lisi badboy username-zhangsan okboy
#上述命令能同时获取多个值
#采用下面的命令进行获取验证
keys username-*;
7.不覆盖设置多个值
mset username-huting goodboy username-lisi badboy username-zhangsan okboy
#上面是设置多个值的命令,现在我们输入下面不覆盖多个值的命令
msetnx username-huting goodbooy username-wangwu goodboy;
#此时发现返回的值是‘0’说明没有执行成功,使用keys username-*发现wangwu也没有设置成功
#说明设置多个不覆盖值,发生冲突时候,整个语句都不执行。
8.内容追加,取得内容的长度,删除指定的内容
#内容追加
append username-huting goodstudent
#返回的值是当前字符串的总长度
#取得key的内容的长度
strlen username-huting
#返回当前值的总长度
# 删除指定的数据内容
del username-huting username-zhangsan username-hehe
#返回值是返回的删除值的个数,这里返回的是2”不存在的数据hehe也不会影响删除操作的正常进行。
二、Hash数据类型
hash是一种常见的数据类型,其数据结构为“key=value”但是这里有必要提醒一下,redis的hash作为一种数据类类型,可以理解为“rediskey = hashvalue”,利用hash数据类型可以保存更多的数据。
1.存放hash数据:haset 对象key 属性key 内容
#设置一个hash类型,保存用户的用户名和真是姓名
hset user-huting id 2015082208
#id 用户名属性 name姓名
hset user-huting name huting
2.取得hash数据:hget 对象key 属性key
#获取值
hget user-huting name
hget user-huting id
补充:
3.不覆盖设置 :hsetnx 对象key 属性key 内容
默认情况下,hset会进行覆盖设置,hsetnx在这里起到不覆盖的作用:
4.批量设置 :hmset 对象key 属性key1 内容1 属key2 内容2.......
hset user-ht name huting sex man age 99
keys *
hget user-ht age
hget user-ht sex
hget user-ht name
5.获取对象的所有key :hmget 对象key 属性key1 属性key2........
hmget user-ht name age sex
6.判断某个数据是否存在:hexists 对象key 属性key
hexists user-ht name #存在返回1
hexists user-ht weight #不存在返回0
7.取得全部内容数量 :hlen key
hlen user-ht
8.删除指定key信息:hdel 对象key 属性key
hdel user-huting id
hdel user-huting name
9.取得所有的hashkey:hkeys 对象key
hkeys user-ht
10.取得hash中所有的内容:hvals 对象key
hvals user-ht
11.获得全部的key与value:hgetall 对象key
hgetall user-ht
12.数据加法:hincrby 对象 key 数字;(见下面)
三、数字操作
如果要进行数字操作,那么肯定要设置两个数字内容:
.设置一个基本类型:
set shopcar-huting-pid 100
.设置一个hash类型:
hset student-huting pid-2015 100
3.1普通数据类型
3.1.1自增处理 incr key
incr shopcar-huting-pid #默认增长为1
3.1.2自增指定数据 incrby key
incrby shopcar-huting-pid 200 #指定增长
3.1.3自减处理 decr key
decr shopcar-huting-pid #减1处理
3.1.4自减指定数据 decrby key
decrby shopcar-huting-pid 100 #指定100减
3.2Hash数据类型
3.2.1数据加法 hincrby 对象 key 数字
hincrby student-huting pid-2015 2
四、List类型
list是一种比较麻烦的处理操作,list特点,链表结构,时间复杂度为n,内容保存,节点遍历。
4.1创建一个描述关键字的集合:【左边入栈,当然也可以选择右边入栈rpush,输出的顺序就和输入顺序一致了】
#先把之前的内容进行一个清空
flushdb
lpush sks huting java redis happy study
4.2进行输出
#遍历集合sks中 0-2范围的值
lrange sks 0 2
#遍历所有的
lrange sks 0 -1
这里我们会发现集合遍历出来的内容和之前设置的内容的顺序是相反的,注意,之前设置内容所用到的命令是lpush,什么意思呢,栈,哈哈,学过数据结构的都懂,不解释。
4.3在指定元素钱追加内容
linset sks before happy perfect #在指定元素前追加,当然after后面追加也可以
注意:如果里面存放了相同的值,那么执行追加的时候以第一个为准。!!!!
4.4修改指定索引的数据
从0开始的,虽然遍历显示的从1开始;下面给例子·
4.5删除数据:lrem 集合key 重复个数 删除内容
lrem sks 1 study
4.6保留指定范围的数据:
ltrim sks 1 2 #删除了范围不在1-2之间的数据
4.7元素出栈
lpop sks #从栈顶出栈,出完栈就没有这个数据了(从左边开始出栈)
4.8将移除的数据保存到另一个集合
lpoplpush sks dsk #将sks栈底出栈 压到dsk的栈顶
4.8取得指定索引的数据
lindex sks 0
4.9取得集合个数
llen sks
五、set数据类型
set最大的特征是基于数据集合的比对处理,实现 交集,并集,差集
5.1向集合中添加元素:sadd 集合key 内容
sadd user-huting a b c d e #像该集合中追加五个元素,假想这五个是五个用户名,说明这五个和key有关系
5.2查询set集合:smembers 集合key
smembers user-huting #我们会发现取得的数据是没有顺序的,set无序,list有序。
5.3删除集合元素:srem 集合key 内容
#情景假想,加入a,b,c,d,e是我关注的五个微博用户,我现在不想关注a这个微博用户了,执行下面的命令
srem user-huting a
5.4从集合中随机弹出一个元素(该元素自动被删除):spop 集合key
5.5返回两个集合的差集:sdiff 集合key1 集合key2
#准备两个集合(假如就是两个用户关注的其他微博用户)
sadd user-huting a b c d e
sadd user-admin a c e x y z
#进行差运算
sdiff user-huting user-admin
#发现是user-huting 来减user-admin,模拟的场景就是当admin登陆的时候,系统给admin推荐差集的内容
5.6 将差集保存到另外一个集合之中 :sdiffstore 存储集合key 集合key1 集合key2
sdiffstore user-huting-admin user-huting user-admin
5.7交集计算:sinter 集合key1 集合key2
sinter user-huting user-admin
5.8将交集保存到新的集合当中: sinterstore 存储集合key 集合key1 集合key2
这里和上面的差集操作类似,不必赘述。
5.9并集计算:sunion 集合key1 集合key2
这里和上面的差集操作类似,不必赘述。
5.10将并集进行存储: sunionstore 存储集合 集合key1 集合 key2
这里和上面的差集操作类似,不必赘述。
5.11 从第一个key对应的set中移除并添加到另外一个set集合之中:smove 集合key1 集合key2 第一个集合内容
smove user-huting user-admin d
5.12 返回名称key的集合个数:scard 集合key
scard user-huting
5.13 测试member是否是名称为key的set的元素:sismember 集合key 内容
sismember user-huting a
#user-huting中是否有a,有返回1 没有返回0
5.14 随机返回名称为key的一个集合的元素,但是不删除元素:srandmember 集合key
srandmember user-huting 3 #3为设置的个数,我们也可以不同设置,默认为是1,这里的操作不会删除元素。
六、SortedSet
set最大的特征就是可以进行数据的比对,但是呢,他本身是无序的保存,如果要进行数据的合理保存,则需要将数据进行有序保存。其实本质上也不是进行的有序的保存,而是采用分数来进行衡量顺序。
6.1追加有序集合数据:zadd 集合key 分数 内容
#首先假想一个场景:某个用户浏览了三件商品,每个商品都只浏览了一次
zadd user-huting1 1 pid-1
zadd user-huting1 1 pid-2
zadd user-huting1 1 pid-3
6.2取出有序集合内容:zrange 集合key 0 -1 withscores
zrange user-huting1 0 -1 #显示所有的元素
zrange user-huting1 0 2 withscores #显示分数
6.3删除集合数据:zrem 集合key 内容
zrem user-huting1 pid-1
6.4数据增长(针对于顺序增加):zincrby 集合key 分数 内容
#增长pid-2这个值的分数,增长幅度是5
zincrby user-huting1 5 pid-2
6.5返回集合中指定元素的索引数值:zrank 集合key 内容
zrank user-huting1 pid-2
6.6反转后取得索引:zrevrank 集合key 内容
zrevrank user-huting1 pid-2 #和上面的对比
6.7反转后取得数据:zrevrange 集合 开始分数 结束分数 withscores
zrange user-huting1 0 2 withscores #显示分数
zrevrange user-huting1 0 2 withscores #反转后显示分数
6.8根据分数范围取得指定范围的数据:zrangebyscore 集合 开始分数 结束分数 withscores
zrangebyscore user-huting1 3 6 withscores #去分数是3-6之间的数据(注意:这里取出来的是闭区间的内容【3,6】)
zrangebyscore user-huting1 (3 (6 withscores #去分数是3-6之间的数据(注意:这里取出来的是闭区间的内容(3,6))
当然:你也可以试试 半开区间半闭区间,这里也是可以的!!!!!
*假如数据过多,也可以限制每次的范围:
zrangebyscore user-huting1 (3 (6 withscores limit 0 2 # 取索引是0-2之间的然后满足分数在(3 ,6)
6.9取得集合中指定分数范围的数量:zcount 集合key 开始分数 结束分数
zcount user-huting1 2 8
6.10取得指定集合中元素个数:zcard 集合key
zcard user-huting1
取得指定的分析key:key*
6.11 根据下标排序,删除指定返回中的数据:zremrangebyrank 集合key 索引开始 结束索引
zremrangebyrank user-huting1 0 5 #删除0 -5的
七、总结
到现在为止 redis的五种数据类型学习完了,redis的速度很快,严格来说redis在一定意义上不属于数据库的范畴了;
1.基本类型(String 、int):基本数据类型更加适合用户的短期存储,字符串可以支持各种复杂的操作,而且支付穿也可以描述各种数据的含义,那么在实际的开发中可以利用此数据类型是先Nginx的数据类型的集群保存,shrio的集群数据报错,以及sprinData数据保存(序列化),json数据保存;
2.hash类型更多描述结构化的信息,不如序列对象化好用,但是至少需要知道hash这样的类型可以进行内容的详细分类;
3list(栈,队列):在实际的开发中,使用此类型实现消息队列的功能,或者缓冲功能。
4 set 数据类型:最大的支持功能在集合的运算上,例如:相似检查,好友推荐。应用案例,新浪微博
5.sortset:主要进行数据的流式分析:
。用户购买商品为例:
访问次数增加分数的值,根据值的大小来推荐商品。