Redis介绍

Redis是一种key-value的存储系统,它是一种nosql(Not Only [SQL])非关系型的数据库,它支持string(字符串)、list(链表)、set(集合)、hash(哈希类型)和zset(sorted set --有序集合)数据类型,这些数据类型有着丰富的操作,且均具有原子性。

Redis基本指令

keys *

前面已经介绍,Redis是一种key-value的存储系统,** keys * ** 便是查看当前库里有何键;

当前库中无任何键,所以输入** keys * **则返回(empty list or set);

127.0.0.1:6379> keys *
(empty list or set)

输入set k1 v1(设置k1的键对应的value值为v1)

set k2 v2(设置k2的键对应的value值为v2)

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK

此时再输入** keys * ** 则返回k2和k1两个键

127.0.0.1:6379> keys *
1) "k2"
2) "k1"

exists < key >

exists < key > 用来判断某个键是否存在;

刚才已经设置了k1和k2两个键;

我们先输入一下exists k1试试看;

127.0.0.1:6379> exists k1
(integer) 1

我们输入exists k3试试看

127.0.0.1:6379> exists k3
(integer) 0

我们发现,当存在这个键时返回1,当不存在时返回0;

type < key >

type < key > 用来查看某个键的类型;

后面介绍了五大数据类型后,一一尝试此指令;

del < key >

del < key >用来删除某个键;

此时当前库中有k1和k2两个键,如输入del k1

127.0.0.1:6379> del k1
(integer) 1

再来查看库中的键,只剩k2了

127.0.0.1:6379> keys *
1) "k2"

如果输入一个不存在的键呢?

127.0.0.1:6379> del k3
(integer) 0

会返回0

expire < key > < seconds >

expire < key > < seconds > 为已经存在的键设置过期时间(单位秒)

如输入expire k2 10,那么k2键将会在10秒后过期;

127.0.0.1:6379> expire k2 10
(integer) 1

10秒后再查看当前库中的键

127.0.0.1:6379> keys *
(empty list or set)

当前库已经空了;

ttl < key >

ttl < key > 用来查看某个键还有多长时间过期:

-1表示永不过期;

-2表示已过期;

依次输入

set test1 1

set test2 2

127.0.0.1:6379> set test1 1
OK
127.0.0.1:6379> set test2 2
OK

此时库中有test1和test2两个键

输入

expire test1 20

意味着给test1设置20秒的过期时间

127.0.0.1:6379> expire test1 20
(integer) 1

一直输入ttl test1

127.0.0.1:6379> ttl test1
(integer) 16
127.0.0.1:6379> ttl test1
(integer) 12
127.0.0.1:6379> ttl test1
(integer) 8
127.0.0.1:6379> ttl test1
(integer) 2
127.0.0.1:6379> ttl test1
(integer) -2
127.0.0.1:6379>

可以看到其过期时间,为-2则为已过期

输入ttl test2查看test2的过期时间

127.0.0.1:6379> ttl test2
(integer) -1

-1表示永不过期

dbsize

此指令用来查看当前redis库中的key的数量;

目前库中只有test2一个键

127.0.0.1:6379> dbsize
(integer) 1

返回1

flushdb

flushdb用来清空当前库,将当前库中所有键删掉

127.0.0.1:6379> flushdb
OK

再输入dbsize

127.0.0.1:6379> dbsize
(integer) 0

数量已经为0

flushall

此指令用来通杀全部库;

当redis 服务器初始化时,会预先分配 16 个数据库(该数量可以通过配置文件配置),我们只用了16个库中的一个,使用此命令会清空所有库中的键,慎用。

可存储的五大数据类型

在介绍前,先输入flushdb清空下当前redis库

127.0.0.1:6379> flushdb
OK

String——字符串

redis的键可以存储字符串String类型的值;下面介绍其相关指令:

set < key > < value >

set < key > < value >用来设置键值对;

如我依次输入

set keyString1 abc

set keyString2 123

127.0.0.1:6379> set keyString1 abc
OK
127.0.0.1:6379> set keyString2 123
OK

用type < key >指令查看类型

127.0.0.1:6379> type keyString1
string
127.0.0.1:6379> type keyString2
string

get < key >

此指令用来查询key对应的值;

如输入get keyString1

127.0.0.1:6379> get keyString1
"abc"

append < key > < tailvalue >

此指令用于将给定的< tailvalue >增加到原来< key >对应的value之后;

目前keyString2 对应 "123";

如输入append keyString2 xyz

127.0.0.1:6379> append keyString2 xyz
(integer) 6

返回其长度6;

再输入get keyString2如下

127.0.0.1:6379> get keyString2
"123xyz"

strlen < key >

此指令获取< key >对应的值的长度;

如下:

127.0.0.1:6379> strlen keyString1
(integer) 3
127.0.0.1:6379> strlen keyString2
(integer) 6

setnx < key > < value >

此指令的用法是:

只有当< key >不存在时才设置键值对;

127.0.0.1:6379> keys *
1) "keyString1"
2) "keyString2"

此时当前库中有两个键;

如输入 setnx keyString3 mnopq

127.0.0.1:6379> setnx keyString3 mnopq
(integer) 1

返回1;

查看当前库中键,查看keyString3对应的值

127.0.0.1:6379> keys *
1) "keyString1"
2) "keyString3"
3) "keyString2"
127.0.0.1:6379> get keyString3
"mnopq"

如输入 setnx keyString1 mnopq

127.0.0.1:6379> setnx keyString1 mnopq
(integer) 0
127.0.0.1:6379> keys *
1) "keyString1"
2) "keyString3"
3) "keyString2"
127.0.0.1:6379> get keyString1
"abc"

由此可见,未改变keyString1的值。

incr < key >

此指令用于将key中储存的数字字符串值增加1 (只能对数字字符串值操作,如果为空,新增值为1);

如输入以下内容:

127.0.0.1:6379> keys *
1) "keyString1"
2) "keyString3"
3) "keyString2"
127.0.0.1:6379> set keyString4 123456
OK
127.0.0.1:6379> incr keyString4
(integer) 123457
127.0.0.1:6379> get keyString1
"abc"
127.0.0.1:6379> incr keyString1
(error) ERR value is not an integer or out of range
127.0.0.1:6379> incr keyString5
(integer) 1
127.0.0.1:6379> keys *
1) "keyString1"
2) "keyString4"
3) "keyString3"
4) "keyString5"
5) "keyString2"
127.0.0.1:6379> get keyString5
"1"

decr < key >

将key中储存的数字值字符串减去1 (只能对数字字符串值操作,如果为空,新增值为-1);

与incr < key > 类似

incrby / decrby < key > < 步长 >

将key中存储的数字值字符串增加/减去自定义步长(只能对数字字符串值操作,如果为空,新增值为步长或者负步长);

mset < key1 > < value1 > < key2 > < value2 > .....

此指令用于同时设置一个或多个 key-value对 ,与set < key > < value >类似,不过是多设置几个;

mget < key1 > < key2 > < key3 > .....

同时获取一个或多个 value ;与get < key >类似,不过是获取多个值;

msetnx < key1 > < value1 > < key2 > < value2 > .....

当且仅当所有给定 key 都不存在时,同时设置一个或多个 key-value 对 ;

与setnx < key > < value >类似;

getrange < key > < 起始位置 > < 结束位置 >

此指令获得值的范围(包前也包后)

127.0.0.1:6379> set keyString6 123456abcdef
OK
127.0.0.1:6379> getrange keyString6 0 6
"123456a"
127.0.0.1:6379> getrange keyString6 1 5
"23456"

如想获取从开始到结束的字符串,结束位置用-1即可;

127.0.0.1:6379> getrange keyString6 0 -1
"123456abcdef"

setrange < key > < 起始位置 > < value2 >

从< 起始位置 >用< value2>开始覆写< key > 所储存的字符串值;

如下所示:

127.0.0.1:6379> get keyString6
"123456abcdef"
127.0.0.1:6379> setrange keyString6 2 xyz
(integer) 12
127.0.0.1:6379> get keyString6
"12xyz6abcdef"

setex < key > < 过期时间 > < value >

设置键值的同时,设置过期时间,单位秒

127.0.0.1:6379> setex kkk 20 123
OK
127.0.0.1:6379> ttl kkk
(integer) 17
127.0.0.1:6379> ttl kkk
(integer) 12
127.0.0.1:6379> ttl kkk
(integer) 9
127.0.0.1:6379> ttl kkk
(integer) 4
127.0.0.1:6379> ttl kkk
(integer) 1
127.0.0.1:6379> ttl kkk
(integer) -2

getset < key > < value >

以新换旧,设置了新值同时获得旧值;

如:

127.0.0.1:6379> get keyString1
"abc"
127.0.0.1:6379> getset keyString1 123
"abc"
127.0.0.1:6379> get keyString1
"123"

list——字符串列表

其底层是双向链表,两端操作性能高,通过索引下标操作中间节点性能较差,下面介绍其指令:

lpush/rpush < key > < value1 > < value2 > < value3 > ....

该指令用于从左边/右边插入一个或多个值;

输入如下:

127.0.0.1:6379> lpush myList1 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> rpush myList2 a b c d e f
(integer) 6
127.0.0.1:6379> lpush myList3 7 8 9
(integer) 3
127.0.0.1:6379> rpush myList3 x y z
(integer) 6

用type查看类型

127.0.0.1:6379> type myList2
list

myList1从左边插入,1先进入,2后进入...所以6在最左边,1在最右边;

myList2从右边插入,a先进入,b后进入...a在最左边,f在最右边;

myList3先从左边插入,7先进入,8后进入,9最后进入,所以从左到右依次时,9,8,7;

myList3再从右边插入,插入后,从左到右依次是,9,8,7,x,y,z;

lrange < key > < start > < stop >

按照索引下标获得元素(从左到右);

127.0.0.1:6379> lrange myList1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> lrange myList3 0 -1
1) "9"
2) "8"
3) "7"
4) "x"
5) "y"
6) "z"
127.0.0.1:6379> lrange myList1 0 2
1) "6"
2) "5"
3) "4"
127.0.0.1:6379>

lpop/rpop < key >

从左边/右边吐出一个值 值在键在,值光键亡;

127.0.0.1:6379> lpop myList1
"6"
127.0.0.1:6379> lrange myList1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> rpop myList1
"1"
127.0.0.1:6379> lrange myList1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
127.0.0.1:6379> lpop myList1
"5"
127.0.0.1:6379> lpop myList1
"4"
127.0.0.1:6379> lpop myList1
"3"
127.0.0.1:6379> lpop myList1
"2"
127.0.0.1:6379> lpop myList1
(nil)
127.0.0.1:6379> exists myList1
(integer) 0

rpoplpush < key1 > < key2 >

从< key1 >列表右边吐出一个值,插到< key2 >列表左边;

如:

127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> lrange myList3 0 -1
1) "9"
2) "8"
3) "7"
4) "x"
5) "y"
6) "z"
127.0.0.1:6379> rpoplpush myList2 myList3
"f"
127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> lrange myList3 0 -1
1) "f"
2) "9"
3) "8"
4) "7"
5) "x"
6) "y"
7) "z"

lindex < key > < index >

按照索引下标获得元素(从左到右)

127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> lindex myList2 2
"c"

llen < key > 获得列表长度

127.0.0.1:6379> llen myList2
(integer) 5
127.0.0.1:6379> llen myList3
(integer) 7

linsert < key > before(after) < value > < newvalue >

此命令为在< key >对应的< value >的前(后)面插入< newvalue >

127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> linsert myList2 before b 123
(integer) 6
127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "123"
3) "b"
4) "c"
5) "d"
6) "e"

lrem < key > < n > < value >

从左边删除n个value(从左到右)

n为正数表示从左往右删除几个

n为负数表示从右往左删几个

n为0表示删除所有

如:

127.0.0.1:6379> rpush myList4 1 a 2 b c a 2 1
(integer) 8
127.0.0.1:6379> lrange myList4 0 -1
1) "1"
2) "a"
3) "2"
4) "b"
5) "c"
6) "a"
7) "2"
8) "1"
127.0.0.1:6379> lrem myList4 1 1
(integer) 1
127.0.0.1:6379> lrange myList4 0 -1
1) "a"
2) "2"
3) "b"
4) "c"
5) "a"
6) "2"
7) "1"
127.0.0.1:6379> lrem myList4 1 2
(integer) 1
127.0.0.1:6379> lrange myList4 0 -1
1) "a"
2) "b"
3) "c"
4) "a"
5) "2"
6) "1"
127.0.0.1:6379> lrem myList4 0 a
(integer) 2
127.0.0.1:6379> lrange myList4 0 -1
1) "b"
2) "c"
3) "2"
4) "1"

set——字符串无序集合

底层其实是一个value为null的 hash表,添加,删除,查找的复杂度都是O(1);

其指令如下:

sadd < key > < value1 > < value2 > .....

将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。

如:

127.0.0.1:6379> sadd mySet1 1 2 3 a b c 2 3
(integer) 6
127.0.0.1:6379> sadd mySet2 x y z m n
(integer) 5

用type查看类型

127.0.0.1:6379> type mySet1
set

smembers < key >

取出该集合的所有值,如:

127.0.0.1:6379> smembers mySet1
1) "1"
2) "3"
3) "2"
4) "b"
5) "c"
6) "a"
127.0.0.1:6379> smembers mySet2
1) "y"
2) "m"
3) "z"
4) "x"
5) "n"

sismember < key > < value >

判断集合< key >是否为含有该< value >值,有返回1,没有返回0;

如:

127.0.0.1:6379> sismember mySet1 a
(integer) 1
127.0.0.1:6379> sismember mySet1 123456
(integer) 0

scard < key >

返回该集合的元素个数

127.0.0.1:6379> scard mySet1
(integer) 6
127.0.0.1:6379> scard mySet2
(integer) 5

srem < key > < value1 > < value2 > ....

删除集合中的某(几)个元素;

127.0.0.1:6379> smembers mySet2
1) "y"
2) "m"
3) "z"
4) "x"
5) "n"
127.0.0.1:6379> srem mySet2 m
(integer) 1
127.0.0.1:6379> smembers mySet2
1) "z"
2) "x"
3) "y"
4) "n"
127.0.0.1:6379> srem mySet2 x n
(integer) 2
127.0.0.1:6379> smembers mySet2
1) "y"
2) "z"
127.0.0.1:6379> srem mySet2 1 2
(integer) 0

删除几个返回几;

spop < key >

随机从该集合中吐出一个元素,会从集合中删除 ;

127.0.0.1:6379> spop mySet1
"3"
127.0.0.1:6379> smembers mySet1
1) "1"
2) "2"
3) "b"
4) "c"
5) "a"

srandmember < key > < n >

随机从该集合中取出n个值,不会从集合中删除

127.0.0.1:6379> smembers mySet1
1) "1"
2) "2"
3) "b"
4) "c"
5) "a"
127.0.0.1:6379> srandmember mySet1 2
1) "1"
2) "b"
127.0.0.1:6379> srandmember mySet1 10
1) "c"
2) "1"
3) "b"
4) "2"
5) "a"
127.0.0.1:6379> smembers mySet1
1) "1"
2) "2"
3) "b"
4) "c"
5) "a"

如果超过集合中的个数,则全部返回;

sinter < key1 > < key2 >

返回两个集合的交集元素;

sunion < key1 > < key2 >

返回两个集合的并集元素;

sdiff < key1 > < key2 >

返回两个集合的差集元素;

如:

127.0.0.1:6379> sadd testSet1 a 1 2 x y
(integer) 5
127.0.0.1:6379> sadd testSet2 a b 2 x z
(integer) 5
127.0.0.1:6379> sinter testSet1 testSet2
1) "a"
2) "x"
3) "2"
127.0.0.1:6379> sunion testSet1 testSet2
1) "1"
2) "y"
3) "x"
4) "2"
5) "b"
6) "a"
7) "z"
127.0.0.1:6379> sdiff testSet1 testSet2
1) "y"
2) "1"

hash——string类型的field和value的映射表

hset < key > < field > < value >

给< key >集合中的 < field >键赋值< value >

127.0.0.1:6379> hset studentInfo student:001:name testName1
(integer) 1

用type查看类型

127.0.0.1:6379> type studentInfo
hash

hget < key1 > < field >

从< key1 >集合< field > 取出 value

127.0.0.1:6379> hget studentInfo student:001:name
"testName1"

hmset < key1 > < field1 > < value1 > < field2 > < value2 >...

批量设置hash的值;

如:

127.0.0.1:6379> hmset studentInfo student:001:stuid 001 student:001:stuname testName1 student:001:stuage 16
OK

hexists < key > < field >

此命令用来查看哈希表 key 中,给定域 field 是否存在

127.0.0.1:6379> hexists studentInfo student:001:stuname
(integer) 1
127.0.0.1:6379> hexists studentInfo student:001:stusex
(integer) 0

hkeys < key >

此命令用于列出该hash集合的所有field ;

hvals < key >

此命令用于列出该hash集合的所有value;

hgetall < key >

此命令用于列出该hash集合所有的key和value;

如:

127.0.0.1:6379> hkeys studentInfo
1) "student:001:name"
2) "student:001:stuid"
3) "student:001:stuname"
4) "student:001:stuage"
127.0.0.1:6379> hvals studentInfo
1) "testName1"
2) "001"
3) "testName1"
4) "16"
127.0.0.1:6379> hgetall studentInfo
1) "student:001:name"
2) "testName1"
3) "student:001:stuid"
4) "001"
5) "student:001:stuname"
6) "testName1"
7) "student:001:stuage"
8) "16"

hincrby < key > < field > < increment >

为哈希表 key 中的域 field 的值加上增量 increment (需为数值型字符串类型);

127.0.0.1:6379> hget studentInfo student:001:stuage
"16"
127.0.0.1:6379> hincrby studentInfo student:001:stuage 2
(integer) 18

hsetnx < key > < field > < value >

当域 field 不存在时将哈希表 key 中的域 field 的值设置为 value ;

127.0.0.1:6379> hsetnx studentInfo student:001:stuage 36
(integer) 0
127.0.0.1:6379> hsetnx studentInfo student:001:stusex male
(integer) 1
127.0.0.1:6379> hget studentInfo student:001:stusex
"male"

zset——字符串有序集合

它是没有重复元素的字符串集合。每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复的。

zadd < key > < score1 > < value1 > < score2 > < value2 >...

此命令用于将一个或多个 member 元素及其 score 值加入到有序集 key 当中;

127.0.0.1:6379> zadd myZset 10 a 100 b 20 c 1000 d 500 e
(integer) 5

用type命令查看

127.0.0.1:6379> type myZset
zset

如果添加相同元素,相同分数肯定是添加不进去的;

如果添加相同元素,不同分数将分数更改为最新的分数;

如果添加不同元素,相同分数 可以添加进去;

127.0.0.1:6379> zadd myZset 10 a
(integer) 0
127.0.0.1:6379> zadd myZset 10000 a
(integer) 0
127.0.0.1:6379> zadd myZset 6 m 6 n
(integer) 2

zrange < key > < start > < stop > [WITHSCORES]

返回有序集 key 中,下标在< start > < stop >之间的元素,带WITHSCORES,可以让分数一起和值返回到结果集。

127.0.0.1:6379> zadd myZset2 10 x 100 y 1000 z
(integer) 3
127.0.0.1:6379> zrange myZset 0 -1
1) "m"
2) "n"
3) "c"
4) "b"
5) "e"
6) "d"
7) "a"
127.0.0.1:6379> zrange myZset 0 -1 WITHSCORES
1) "m"
2) "6"
3) "n"
4) "6"
5) "c"
6) "20"
7) "b"
8) "100"
9) "e"
10) "500"
11) "d"
12) "1000"
13) "a"
14) "10000"

zvrange < key > < start > < stop > [WITHSCORES]

同上,改为从大到小排列。

zrangebyscore key min max [ withscores ] [ limit offset count ]

返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。

127.0.0.1:6379> zrangebyscore myZset 100 1000
1) "b"
2) "e"
3) "d"
127.0.0.1:6379> zrangebyscore myZset 1000 1000
1) "d"

如果知道一个值的分数,min和max均写此分数即可;

zrevrangebyscore key max min [ withscores ] [ limit offset count ]

同上,改为从大到小排列。

zincrby < key > < increment > < value >

此指令用于为元素的score加上增量;

127.0.0.1:6379> zadd myZset2 10 x 100 y 1000 z
(integer) 3
127.0.0.1:6379> zincrby myZset2 20 x
"30"
127.0.0.1:6379> zrange myZset2 0 -1 WITHSCORES
1) "x"
2) "30"
3) "y"
4) "100"
5) "z"
6) "1000"

zrem < key > < value >

删除该集合下,指定值的元素;

如:

127.0.0.1:6379> zrem myZset2 x
(integer) 1
127.0.0.1:6379> zrange myZset2 0 -1 WITHSCORES
1) "y"
2) "100"
3) "z"
4) "1000"

zcount < key > < min > < max >

统计该集合,分数区间内的元素个数;

127.0.0.1:6379> zrange myZset 0 -1 WITHSCORES
1) "m"
2) "6"
3) "n"
4) "6"
5) "c"
6) "20"
7) "b"
8) "100"
9) "e"
10) "500"
11) "d"
12) "1000"
13) "a"
14) "10000"
127.0.0.1:6379> zcount myZset 100 1000
(integer) 3

zrank < key > < value >

返回该值在集合中的排名,从0开始

127.0.0.1:6379> zrank myZset e
(integer) 4

最后

本文介绍了Redis基本指令、可存储的五大数据类型和这五大数据类型的指令,希望大家可以通过此篇入门Redis.。

欢迎关注

扫下方二维码即可关注:

简简单单入个Redis的门的更多相关文章

  1. 新人入坑Redis必会的吐血总结

    新人入坑Redis必会的吐血总结 一.什么是Redis Redis是一个使用C语言开发的开源的高性能的key-value存储系统,我们可以把它近似理解为Java Map.简单来讲,Redis是一种NO ...

  2. 10 个 Redis 建议/技巧

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/145.html?1455790611 Redis 在当前的技术社区里是非常 ...

  3. Redis集群方案应该怎么做

    方案1:Redis官方集群方案 Redis Cluster Redis Cluster是一种服务器sharding分片技术.Redis Cluster集群如何搭建请参考我的另一篇博文:http://w ...

  4. nginx+redis缓存微信的token数据

    上一篇文章我们讲了如何在负载均衡的项目中使用redis来缓存session数据,戳这里. 我们在项目的进展过程中,不仅需要缓存session数据,有时候还需要缓存一些别的数据,比如说,微信的acces ...

  5. C#使用Redis

    一,引入dll 1.ServiceStack.Common.dll 2.ServiceStack.Interfaces.dll 3.ServiceStack.Redis.dll 4.ServiceSt ...

  6. Linux云计算运维-Redis

    Redis简介 Redis是一款开源的,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品. Redis采用内存(In-Memory)数据集(DataSet) ...

  7. redis 资料

    redis是什么: Redis is an open source, BSD licensed, advanced key-value store. It is often referred to a ...

  8. 基于redis的分布式锁实现

    1.分布式锁介绍 在计算机系统中,锁作为一种控制并发的机制无处不在. 单机环境下,操作系统能够在进程或线程之间通过本地的锁来控制并发程序的行为.而在如今的大型复杂系统中,通常采用的是分布式架构提供服务 ...

  9. Redis的搭建和Redis的集群搭建

    1.Redis的官网:https://redis.io/      Redis的测试网站:http://try.redis.io/ 2.参考博客:https://www.cnblogs.com/maf ...

随机推荐

  1. SpringValid优雅校验入参

    一.简介 后台业务入口类Controller,对于入参的合法性校验,可以简单粗暴的写出一堆的 if 判断,如下: @RestController @RequestMapping("user& ...

  2. dubbo学习(六)dubbo管理控制台

    管理控制台的安装与使用 下载地址:https://github.com/apache/dubbo-admin/tree/master(包含管理控制台和监控中心) PS:  下载前要选择master分支 ...

  3. 常用JVM 启动参数解析

    https://www.jianshu.com/p/a17dcef57559 https://www.cnblogs.com/zkyefei/p/9334562.html

  4. 1.UiPath账密安全保存常见方法

    今天在写流程的时候突然用到密码保存,看到同事不同项目中所用到的方法不同,就看了一下别的同学博客,总结的特别好,自己跟着实操了一遍,受益匪浅. RPA适合于登录不同的系统代替人工操作,而登录系统时难免要 ...

  5. 一种统计ListView滚动距离的方法

    注:本文同步发布于微信公众号:stringwu的互联网杂谈 一种统计ListView滚动距离的方法 ListView做为Android中最常使用的列表控件,主要用来显示同一类的数据,如应用列表,商品列 ...

  6. centos7中nfs共享的配置方法

    NFS是Network File System的缩写,即网络文件系统.客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到本地目录下. 一.nfs为什么需要RPC? 因为NFS支持的功能很多,不同 ...

  7. CF600E Lomsat gelral 树上启发式合并

    题目描述 有一棵 \(n\) 个结点的以 \(1\) 号结点为根的有根树. 每个结点都有一个颜色,颜色是以编号表示的, \(i\) 号结点的颜色编号为 \(c_i\)​. 如果一种颜色在以 \(x\) ...

  8. 我竟在arm汇编除法算法里找到了leetcode某道题的解法

    今天讲讲arm汇编中除法的底层实现.汇编代码本身比较长了,如需参考请直接拉到文末. 下面我直接把arm的除法算法的汇编代码转译成C语言的代码贴出来,并进行解析. 因为篇幅有限,所以在此只解析无符号整型 ...

  9. Java知识日常收集整理001Java获取变量的数据类型的实现方法

    一.具体情况区分 对于简单类型变量,是无法直接获得变量类型的:要想获取,必须自定义函数进行返回. 对于包装类型变量,是可以直接获得的,变量名称.getClass().getName(); 二.代码实现 ...

  10. 【题解】[SCOI]windy数

    Link 题目大意:求给定一个区间内满足每一位的数相差大于\(2\)且没有前导零的数的个数. \(\text{Solution:}\) 我们可以按照数位\(dp\).设状态为当前要\(dp\)第\(p ...