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. pytest自学第一期

    开始自学pytest了,我并不想看网上的各种自学教程和文档,要看咱们今天就看pytest的官方文档,不会英语咱们就用翻译,看不懂原理咱们就翻源码,就人肉试错 学习一个技术,使用速成鸡的套路是一个办法, ...

  2. UGOPEN实现解析NX表达式

    UGOPEN函数UF_MODL_dissect_exp_string可以解析表达式,但是当表达式存在附注信息时,会将附注信息附加在 rhs_str上,例如: 这样,当单独获取附注信息时还需要拆分字符串 ...

  3. ASP.NET Core 基于声明的访问控制到底是什么鬼?

    从ASP.NET 4.x到ASP.NET Core,内置身份验证已从基于角色的访问控制(RBAC)转变为基于声明的访问控制(CBAC). 我们常用的HttpContext.User属性ASP.NET ...

  4. Alink漫谈(二十二) :源码分析之聚类评估

    Alink漫谈(二十二) :源码分析之聚类评估 目录 Alink漫谈(二十二) :源码分析之聚类评估 0x00 摘要 0x01 背景概念 1.1 什么是聚类 1.2 聚类分析的方法 1.3 聚类评估 ...

  5. 微服务电商项目发布重大更新,打造Spring Cloud最佳实践!

    Spring Cloud实战电商项目mall-swarm地址:转发+关注 私信我获取地址 系统架构图   系统架构图 项目组织结构 mall├── mall-common-- 工具类及通用代码模块├─ ...

  6. MacOS如何正确配置Idea自带Maven插件的环境变量?(亲测)

    背景 安装了IDEA开发工具,想执行Maven的命令.但是又没有通过自己下载Maven的安装包进行安装,只是想直接使用IDEA自带的Maven插件来执行Maven的各种命令.由于刚开始使用macos对 ...

  7. 001 01 Android 零基础入门 01 Java基础语法 01 Java初识 01 导学

    001 01 Android 零基础入门 01 Java基础语法 01 Java初识 01 导学 welcome to Java World 欢迎来到Java世界 一起领略Java编程世界的奥秘与奥妙 ...

  8. C/C++的二分查找

    假设有一种温度传感器,已经测得它的电压和温度的对应关系,将电压值以ADC转换后的数字量的值表示,形成温度-AD值的对照表,如下. 大致成一条反比关系的曲线. ADC的底层驱动已经写好,对外有一个接口可 ...

  9. matlab find函数使用语法

    find 找到非零元素的索引和值 语法: 1. ind = find(X) 2. ind = find(X, k) 3. ind = find(X, k, 'first') 4. ind = find ...

  10. 联赛模拟测试12 C. sum 莫队+组合数

    题目描述 分析 \(80\) 分的暴力都打出来了还是没有想到莫队 首先对于 \(s[n][m]\) 我们可以很快地由它推到 \(s[n][m+1]\) 和 \(s[n][m-1]\) 即 \(s[n] ...