安装好了redis,下面我们来简单试用一下redis
一般redis有16个库,切换库
select 1
切换到第二个库
设置 aaa
set aaa 111
获取aaa
127.0.0.1:6379[1]> get aaa
"111"
再切换到第一个数据库,再获取aaa 发现是nil
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> get aaa
(nil)
如上图所示。
当前在第一个数据库,我们删除此数据库的东西
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> get aaa
(nil)
再切换到第二个数据库,查询一下aaa还有吗:
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get aaa
"111"
发现还在,接下来我们切换到第三个数据库,然后执行删除所有库(flushall),然后在切换到第二个数据库,然后查看aaa
127.0.0.1:6379[1]> select 2
OK
127.0.0.1:6379[2]> get aaa
(nil)
127.0.0.1:6379[2]> flushall
OK
127.0.0.1:6379[2]> get aaa
(nil)
127.0.0.1:6379[2]> select 1
OK
127.0.0.1:6379[1]> get aaa
(nil)
查询所有的键:
127.0.0.1:6379> keys *
1) "aaa"
2) "bbb"
查看当前数据库的容量:
127.0.0.1:6379> dbsize
(integer) 2
查询一个键是否存在:
127.0.0.1:6379> exists aaa
(integer) 1
如果存在就是1 如果不存在就是0
删除一个键
127.0.0.1:6379> del aaa
(integer) 1
127.0.0.1:6379> keys *
1) "bbb"
查询设置的数据类型
127.0.0.1:6379> set aaa jielun
OK
127.0.0.1:6379> type aaa
string
127.0.0.1:6379> set ccc 345
OK
127.0.0.1:6379> type ccc
string
redis一共有几种数据类型
一般有:String / Lists / Sets / Sorted Sets / Hashes
redis 中字符串(String)可以存储什么类型的数据:
1.int
2.float
3.String
批量set值:
127.0.0.1:6379> mset qingshan 2673 jack 666
OK
127.0.0.1:6379> get qingshan
"2673"
127.0.0.1:6379> get jack
"666"
设置值(只有这个键不存在的时候才可以成功) setnx
127.0.0.1:6379> setnx qingshan 8787
(integer) 0
127.0.0.1:6379> get qingshan
"2673"
因为已经存在qingshan了,所以setnx设置不成功 如果是set的话键即使存在也会覆盖
所以setnx可以做分布式锁,释放锁 就用 del key
比如我们设置一把锁:
127.0.0.1:6379> setnx lock 2673
(integer) 1
127.0.0.1:6379> get lock
"2673"
给这把锁(lock这个键)设置过期时间 expire
127.0.0.1:6379> expire lock 10
(integer) 1
127.0.0.1:6379> get lock
"2673"
127.0.0.1:6379> get lock
"2673"
127.0.0.1:6379> get lock
"2673"
127.0.0.1:6379> get lock
"2673"
127.0.0.1:6379> get lock
"2673"
127.0.0.1:6379> get lock
"2673"
127.0.0.1:6379> get lock
"2673"
127.0.0.1:6379> get lock
"2673"
127.0.0.1:6379> get lock
(nil)
127.0.0.1:6379> get lock
(nil)
上文中我们给lock这个键设置了过期时间为10秒,如上所示我一直获取lock的值,10秒后 就获取不到了
使用组合命令设置值并且设置过期时间,并且NX表示不存在的时候才能设置成功
127.0.0.1:6379> set lock 777 EX 20 NX
OK
127.0.0.1:6379> get lock
"777"
127.0.0.1:6379> get lock
"777"
127.0.0.1:6379> get lock
(nil)
表示给lock设置值为777 过期时间为20秒 只有在lock不存在的时候才可以设置成功
如下,我们先给lock设置一个值为666,然后在使用这个命令给lock设置值,没有成功,见下:
127.0.0.1:6379> set lock 666
OK
127.0.0.1:6379> get lock
"666"
127.0.0.1:6379> set lock 888 EX 10 NX
(nil)
我们给一个键设置数字之后对这个值进行加减操作
加1:incr key
127.0.0.1:6379> set aaa 123
OK
127.0.0.1:6379> get aaa
"123"
127.0.0.1:6379> incr aaa
(integer) 124
127.0.0.1:6379> get aaa
"124"
减1:decr key
127.0.0.1:6379> decr aaa
(integer) 123
127.0.0.1:6379> get aaa
"123"
给一个键设置浮点数,并且进行加法(incrbyfloat):
127.0.0.1:6379> set f 2.6
OK
127.0.0.1:6379> get f
"2.6"
127.0.0.1:6379> incrbyfloat f 7.3
"9.9"
127.0.0.1:6379> get f
"9.9"
批量获取值:
127.0.0.1:6379> mget qingshan aaa jack f
1) "2673"
2) "123"
3) "666"
4) "9.9"
这种批量的操作也是原子性的,不会发送三条命令
给字符串后面添加字符串(append)
127.0.0.1:6379> get qingshan
"2673"
127.0.0.1:6379> append qingshan goodteacher
(integer) 15
127.0.0.1:6379> get qingshan
"2673goodteacher"
reids 底层是怎么存储的?
以这个为例:给hello 设置 world
127.0.0.1:6379> set hello world
OK
String 有三种编码
1.int,存储8个字节的cc长整型(long, 2*63-1)
2.embstr(小于44个字节),embstr格式的SDS
3.raw,SDS,存储大于44个字节的字符串
使用 object encoding key 来查询一个键值使用社么编码存储的我们来做一个实验
127.0.0.1:6379> mset b1 123 b2 str b3 6789
OK
127.0.0.1:6379> mget b1 b2 b3
1) "123"
2) "str"
3) "6789"
127.0.0.1:6379> object encoding b1
"int"
127.0.0.1:6379> object encoding b2
"embstr"
127.0.0.1:6379> object encoding b3
"int"
127.0.0.1:6379> append b3 hello
(integer) 9
127.0.0.1:6379> get b3
"6789hello"
127.0.0.1:6379> object encoding b3
"raw"
如上所示 我们先批量给b1,b2,b3 分别设置 123,str,6789
然后我们使用object encoding key 分别查看 b1, b2, b3 底层存储的SDS的类型
我们看到 b1=123 是int
b2=str 是embstr
b3=6789 是int
b3 是 6789 当然是int 那么我们给b3 追加一个hello 变成6789hello
我们再来看 object encoding b3 我们看到了 第三种类型 raw
embstr和raw的区别
embstr 分配内存的时候就一次分布是连续的
但是raw 分配内存时多分配了一次,是不连续的
Spring的应用场景
1.缓存
2.分布式Session
3.分布式锁 setnx NX
4.全局ID的实现(incr)
5.计数器(incr)--点赞数,阅读量
6.限流 (incr)
7.位操作
redis设置hash
hset(
key
,
field
, value)
--> 设置hash的操作
# 参数: #
key
,redis的key
#
key
,
field
对应的hash中的
key
# value,
name
对应的hash中的value
# 注: # hsetnx(
key
,
field
, value),当
name
对应的hash中不存在当前
key
时则创建(相当于添加)
127.0.0.1:6379[1]> hset h1 f 6
(integer) 1
127.0.0.1:6379[1]> hget h1
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379[1]> hget h1 f
"6"
批量设置,批量设置 h1 a=1 b=2 c=3 d=4
127.0.0.1:6379[1]> hmset h1 a 1 b 2 c 3 d 4
OK
获取h1 的 a 的value
127.0.0.1:6379[1]> hget h1 a
"1"
批量获取key为h1 的 field为a,b,c,d的value
127.0.0.1:6379[1]> hmget h1 a b c d
1) "1"
2) "2"
3) "3"
4) "4"
获取key为h1的所有fields
127.0.0.1:6379[1]> hkeys h1
1) "a"
2) "b"
3) "c"
4) "d"
获取key为h1 的所有values
127.0.0.1:6379[1]> hvals h1
1) "1"
2) "2"
3) "3"
4) "4"
获取key为h1 的所有fields和values
127.0.0.1:6379[1]> hgetall h1
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
7) "d"
8) "4"
reids中Hash的存储结构有两种:
1.ziplist (压缩列表)
2.ht(hashtable)
redis中Hash的应用场景
key:用户id
field:商品id
value:商品数量
+1:hincr
-1: hdecr
删除:hdel
全选:hgetall
商品数:hlen
不积跬步,无以至千里
不积小流,无以成江海