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

一、什么是Redis

Redis是一个使用C语言开发的开源的高性能的key-value存储系统,我们可以把它近似理解为Java Map。简单来讲,Redis是一种NOSQL内存数据库,小伙伴们可不要把它理解为NO SQL(不是SQL),它的全称是Not Only SQL(不仅仅是SQL),换个层面来讲,它是一种非关系型的数据库,它是作为关系型数据库的良好补充,它与传统的MySQL,Oracle不同之处在于,它是通过在内存中读写数据,大大提高了读写速度。可以说,Redis是为了解决网站高并发、高可用、高可扩展、大数据存储等一系列问题而产生的数据库解决方案,不可或缺的一部分。

它具有以下特点:

1、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

2、Redis不仅仅支持简单的key-value类型的数据,同时还提供string、list、set、sortedset、hash等数据结构的存储。

3、Redis支持数据的备份,即master-slave模式的数据备份。

Redis有五种键值类型:

  • String字符类型

  • hash散列类型

  • list列表类型

  • set集合类型

  • sortedset有序集合类型

而本文将基于Redis5.0为例来介绍Redis一些相关命令的使用和踩过的坑

二、关于Redis的安装与启动

环境准备

安装教程请参看这里:https://www.cnblogs.com/ECJTUACM-873284962/p/9532043.html

在线环境

官网似乎提供了一个在线的Redis平台,链接在这里:http://try.redis.io/

Redis启动

前端启动

按照我所提供的教程安装以后,我们只需要输入命令redis-server即可,界面如下:

前端停止启动
  • 强制关闭:Ctrl+c

  • 正常关闭[root@sakura]# redis-cli shutdown

后端启动

因为Redis在实际使用中不会只是一个Redis单独工作,启动和关闭方式中的ip地址和端口号可以在配置文件中自行修改,下面会有修改方式.

启动方式

  1. 需要将redis解压之后的源码包中的redis.conf文件拷贝到bin目录下.直接复制粘贴即可

  2. 修改redis.conf文件,将daemonize改为yes(vi redis.conf进去,:/daemonize搜索).

  3. 使用命令后端启动redis.命令行redis-server redis.conf(以配置文件启动)

  4. 查看是否启动成功.命令行 ps -aux | grep redis (直接查看redis的进程)

如果你之前按照我所提供的教程修改过,这一过程可以直接忽略就好

关闭方式

  • 强制关闭:kill -9 PID

  • 正常关闭:redis-cli -h ip地址 -p 端口号(默认端口号是6379) shutdown

在项目中,建议使用正常关闭。 因为redis作为缓存来使用的话,将数据存储到内存中,如果使用正常关闭,则会将内存数据持久化到本地之后,再关闭。如果是强制关闭,则不会进行持久化操作,可能会造成部分数据的丢失。

Redis客户端启动

启动客户端命令:[root@sakura]# redis-cli -h ip地址 -p 端口号

由于默认IP是127.0.0.1,端口是6379,我们只需要输入命令redis-cli即可

退出:127.0.0.1:6379> quit即可

三、Redis数据类型及常用命令讲解

1、Redis-String

string使用环境:主要用于保存json格式的字符串

赋值

set key value:设定key持有指定的字符串value,如果该key存在则进行覆盖操作,总是返回"OK",如果赋予相同的key,新的value会覆盖老的value

example:

127.0.0.1:6379> set username zhangsan
OK
取值

get key:获取key的value。如果与该key关联的value不是string类型,redis将返回错误信息,因为get命令只能用于获取string value;如果该key不存在,返回nil

example:

127.0.0.1:6379> get username
"zhangsan"
删除

del key:删除指定key,返回值是数字类型,表示删了几条数据

example:

127.0.0.1:6379> del username
(integer) 1
扩展

getset key value:先获取该key的值,然后再设置该key的值

example:

127.0.0.1:6379> getset username zhangsan
(nil)
127.0.0.1:6379> keys *
1) "username"
127.0.0.1:6379> get username
"zhangsan"

incr key:将指定的key的value原子性的递增1,如果该key不存在,其初始值为0,在incr之后的值为1,如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息,相当于++(作用:统计网站访客人数,当计数器)

example:

127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> incr age
(integer) 19

decr key:将指定的key的value原子性的递减1,如果该key不存在,其初始值为0,在incr之后的值为-1,如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息,相当于--i

example:

127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> decr age
(integer) 17

append key value:拼接字符串,如果该key存在,则在原有的value后追加该值,如果该key不存在,则重新创建一个key/value

example:

127.0.0.1:6379> set information hel
OK
127.0.0.1:6379> append information lo
(integer) 5
127.0.0.1:6379> get information
"hello"

incrby和decrby:只能对字符串是数字的进行操作,incrby key value是对原有的key的值增加value,而decrby key value是对原有的key的值减少value

example:

127.0.0.1:6379> get age
"17"
127.0.0.1:6379> incrby age 10
(integer) 27
127.0.0.1:6379> decrby age 10
(integer) 17
127.0.0.1:6379> get information
"hello"
127.0.0.1:6379> incrby information 10
(error) ERR value is not an integer or out of range
127.0.0.1:6379> decrby information 10
(error) ERR value is not an integer or out of range

2、Redis-hash

Redis中的hash类型可以看成具有string key和string value的map容器,所以该类型非常适合于存储值对象的信息。如username,password和age等。如果hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个hash可以存储4294967295个键值对。

hash特点:占用的磁盘空间极少

赋值:

hset key field value:为指定的key设定field/value对(键值对)

example:

127.0.0.1:6379> hset key1 field1 123
(integer) 1

hmset key field value[field2 value2...]:设置key中的多个field/value

example:

127.0.0.1:6379> hmset aaa name kitty age 20
OK
取值:

hget key filed:获取指定的key的field的值

example:

127.0.0.1:6379> hget key1 field1
"123"

hmget key filed1 field2...:获取key中的多个field的值

example:

127.0.0.1:6379> hmget aaa name age
1) "kitty"
2) "20"

hgetall key:获取key中的所有field-value2

example:

127.0.0.1:6379> hgetall aaa
1) "name"
2) "kitty"
3) "age"
4) "20"
删除

hdel key field[field...]:可以删除一个或多个字段,返回值是被删除的字段个数

example:

127.0.0.1:6379> hdel key1 field1
(integer) 1

del key:删除整个list

example:

127.0.0.1:6379> del aaa
(integer) 1
增加数字

hincrby key field increment:设置key中的field增加increment,如age增加20

example:

127.0.0.1:6379> hmset aaa name kitty age 20
OK
127.0.0.1:6379> hincrby aaa age 20
(integer) 40
扩展命令

hexists key field:判断指定的key中的field是否存在

example:

127.0.0.1:6379> hexists aaa name
(integer) 1
127.0.0.1:6379> hexists aaa aaaa
(integer) 0

hlen key:获取key所包含的field的数量

example:

127.0.0.1:6379> hlen aaa
(integer) 2

hkeys key:获得所有的字段

example:

127.0.0.1:6379> hkeys aaa
1) "name"
2) "age"

3、Redis-list

Redis中list选取的是链表,因为在Redis操作中,最多的操作是进行元素的增删

赋值

lpush key value [value1 value2 ...] 在指定的key所关联的list头部插入所有的value,如果该key不存在,该命令在插入之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据,插入成功,返回元素的个数。

example:

127.0.0.1:6379> lpush score1 1 2 3 4 5
(integer) 5

rpush key value [value1 value2 ...] 在该list的尾部添加元素

example:

127.0.0.1:6379> rpush score2 1 2 3 4 5
(integer) 5
取值

lrange key start end:获取链表中从start到end的元素的值,start、end从0开始计数;也可以为负数,若为-1则表示链表尾部的元素,-2表示倒数第二个,以此类推...

example:

127.0.0.1:6379> lrange score1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lrange score2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
删值

lpop key:返回并弹出指定的key关联的链表中的第一个元素,即头部元素。如果该key不存在,返回nil;若key存在,则返回链表的头部元素

example:

127.0.0.1:6379> lpop score1
"5"
127.0.0.1:6379> lpop score2
"1"

rpop key:从尾部弹出元素

example:

127.0.0.1:6379> rpop score1
"1"
127.0.0.1:6379> rpop score2
"5"
扩展

llen key:返回指定的key关联的链表中的元素的数量

example:

127.0.0.1:6379> llen score1
(integer) 3
127.0.0.1:6379> llen score2
(integer) 3

lrem key count value:删除count个值为value的元素,如果count大于0,从头到尾遍历并删除count个值为value的元素,如果count小于0,则从尾到头遍历并删除,如果count等于0,则删除链表中所有等于value的元素。

example:

127.0.0.1:6379> lrem score1 1 2
(integer) 1
127.0.0.1:6379> lrem score2 1 2
(integer) 1
通过索引替换

lset key index value:设置链表中的index的脚标的元素值,0代表链表的头元素,-1代表链表的尾元素。操作链表的脚标不存在则抛出异常

example:

127.0.0.1:6379> lset score1 0 1
OK
127.0.0.1:6379> lset score2 0 1
OK
在索引前/后插入元素

linsert key before|after pivot value:在pivot元素前或者后插入value这个元素

example:

127.0.0.1:6379> linsert score1 before 3 aaa
(integer) 3
127.0.0.1:6379> lrange score1 0 -1
1) "1"
2) "aaa"
3) "3"
127.0.0.1:6379> linsert score1 after 3 bbb
(integer) 4
127.0.0.1:6379> lrange score1 0 -1
1) "1"
2) "aaa"
3) "3"
4) "bbb"

rpoplpush resource destination:将链表中的尾部元素弹出并添加到头部。[循环操作]

example:

127.0.0.1:6379> lrange score1 0 -1
1) "1"
2) "aaa"
3) "3"
127.0.0.1:6379> lrange score2 0 -1
1) "bbb"
2) "1"
3) "4"
127.0.0.1:6379> rpoplpush score1 score2
"3"
127.0.0.1:6379> lrange score1 0 -1
1) "1"
2) "aaa"
127.0.0.1:6379> lrange score2 0 -1
1) "3"
2) "bbb"
3) "1"
4) "4"

4、Redis-set

赋值

sadd key value[value1 value2...]:向set中添加元素,如果该key的值已有则不会重复添加

example:

127.0.0.1:6379> sadd abc 1 2 3 4
(integer) 4

srem key member[member1 member2...]:删除set中指定的成员

example:

127.0.0.1:6379> srem abc 1 3
(integer) 2
取值

smembers key:获取set中所有的成员

example:

127.0.0.1:6379> smembers abc
1) "2"
2) "4"

sismember key member:判断参数中指定的成员是否在该set中,1表示存在,0表示不存在或者该key本身就不存在(无论集合中有多少元素都可以极速的返回结果)

example:

127.0.0.1:6379> sismember abc 2
(integer) 1
127.0.0.1:6379> sismember abc 3
(integer) 0
删值

集合运算

差集运算

sdiff key1 key2...:返回key1与key2中相差的成员,而且与key的顺序有关,即返回差集

example:

127.0.0.1:6379> sadd set1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> sadd set2 3 4 5 6 7
(integer) 5
127.0.0.1:6379> sdiff set1 set2
1) "1"
2) "2"
127.0.0.1:6379> sdiff set2 set1
1) "6"
2) "7"

交集运算

sinter key1 key2...:返回交集

example:

127.0.0.1:6379> sinter set1 set2
1) "3"
2) "4"
3) "5"

并集运算

sunion key1 key2...:返回并集

example:

127.0.0.1:6379> sunion set1 set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
扩展命令

scard key:获取set中成员的数量

example:

127.0.0.1:6379> scard set1
(integer) 5

srandmember key:随机返回set中的一个成员

example:

127.0.0.1:6379> srandmember set1
"1"
127.0.0.1:6379> srandmember set1
"5"
127.0.0.1:6379> srandmember set1
"3"

sdiffstore destination key1 key2...:将key1 key2...相差的成员存储在destination上

example:

127.0.0.1:6379> sdiffstore set3 set1 set2
(integer) 2
127.0.0.1:6379> smembers set3
1) "1"
2) "2"

sinterstore destination key[key...]:将返回的交集存储在destination上

example:

127.0.0.1:6379> sinterstore set4 set1 set2
(integer) 3
127.0.0.1:6379> smembers set4
1) "3"
2) "4"
3) "5"

5、Redis-sortedset

赋值

zadd key score member score2 member2...:将所有成员以及该成员的分数存放到sorted-set中。如果该元素已经存在则会用新的分数代替原有的分数,返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。

example:

127.0.0.1:6379> zadd list 50 xiaoming 100 xiaohong 200 xiaozhang
(integer) 3
取值

zscore key member:返回指定成员的分数

example:

127.0.0.1:6379> zscore list xiaohong
"100"

zcard key:获取集合中的成员数量

example:

127.0.0.1:6379> zcard list
(integer) 3
范围查询

zrange key start end[withscores]:获取集合中脚标为start-end的成员,[withscores]参数表明返回的成员包含其分数(分数从小到大排序)

example:

127.0.0.1:6379> zrange list 0 -1
1) "xiaoming"
2) "xiaohong"
3) "xiaozhang"
127.0.0.1:6379> zrange list 0 -1 withscores
1) "xiaoming"
2) "50"
3) "xiaohong"
4) "100"
5) "xiaozhang"
6) "200"

zrevrange key start end[withscores]:获取集合中脚标为start-end的成员,[withscores]参数表明返回的成员包含其分数(分数从大到小排序)

example:

127.0.0.1:6379> zrevrange list 0 -1
1) "xiaozhang"
2) "xiaohong"
3) "xiaoming"
127.0.0.1:6379> zrevrange list 0 -1 withscores
1) "xiaozhang"
2) "200"
3) "xiaohong"
4) "100"
5) "xiaoming"
6) "50"
删值

zrem key member[member...]:移除集合中指定的成员,可以指定多个成员

example:

127.0.0.1:6379> zrem list xiaozhang
(integer) 1

zremrangebyrank key start stop:按照排名范围删除元素

example:

127.0.0.1:6379> zremrangebyrank list 0 1
(integer) 2

zremrangebyscore key min max:按照分数范围删除元素

example:

127.0.0.1:6379> zremrangebyscore list 50 120
(integer) 2
扩展命令

zrangebyscore key min max [withscores][LIMIT offset count]:返回分数在[min,max]的成员并按照分数从低到高排序。[withscores]:显示分数;[LIMIT offset count]:offset,表明从脚标为offset的元素开始并返回count个成员

example:

127.0.0.1:6379> zrangebyscore list 50 120 withscores limit 0 2
1) "xiaoming"
2) "50"
3) "xiaohong"
4) "100"

zincrby key increment member:设置指定成员的增加的分数,返回值是更改后的分数

example:

127.0.0.1:6379> zincrby list 30 xiaoming
"80"

zcount key min max:获取分数在[min,max]之间的成员

example:

127.0.0.1:6379> zcount list 80 120
(integer) 2

zrank key member:返回成员在集合中的排名(索引从小到大)

example:

127.0.0.1:6379> zrank list xiaohong
(integer) 1

zrevrank key member:返回成员在集合中的排名。(索引从大到小)

example:

127.0.0.1:6379> zrevrank list xiaozhang
(integer) 0

6、通用Redis命令【重点】

keys pattern:获取所有与pattern匹配的key,返回所有与该key匹配的keys。*表示任意一个或者多个字符

通配符:

  • *表示任意0个或者多个字符

  • ?表示任意一个字符

exits key:判断该key是否存在,1表示存在,0表示不存在

example:

127.0.0.1:6379> exists username
(integer) 1
127.0.0.1:6379> exists admin
(integer) 0

rename key newkey:为当前的key重命名

127.0.0.1:6379> rename username user
OK
127.0.0.1:6379> keys *
1) "list"
2) "abc"
3) "set1"
4) "information"
5) "set2"
6) "age"
7) "score2"
8) "set4"
9) "score1"
10) "set3"
11) "user"

type key:获取指定的key的值类型,该命令将以字符串的格式返回。返回的字符串为string、list、set、hash和zset,

如果key不存在返回none

example:

127.0.0.1:6379> type user
string
127.0.0.1:6379> type list
zset

expire key:设置过期时间,单位:秒 如果某个key过期,redis会将其删除

example:

127.0.0.1:6379> expire abc 10
(integer) 1
127.0.0.1:6379> keys *
1) "list"
2) "set1"
3) "information"
4) "set2"
5) "age"
6) "score2"
7) "set4"
8) "score1"
9) "set3"
10) "user"

ttl key:获取该key所剩的超时时间,如果没有设置超时时间,返回-1.如果返回-2表示超时不存在。

example:

127.0.0.1:6379> expire user 10
(integer) 1
127.0.0.1:6379> ttl user
(integer) 3
127.0.0.1:6379> ttl user
(integer) -2
127.0.0.1:6379> keys *
1) "list"
2) "set1"
3) "information"
4) "set2"
5) "age"
6) "score2"
7) "set4"
8) "score1"
9) "set3"
127.0.0.1:6379> ttl information
(integer) -1

7、Redis其他特性

消息订阅与发布

subscribe channel:订阅频道

example:

127.0.0.1:6379> subscribe mychat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychat"
3) (integer) 1

psubscribe channel*:批量订阅频道

example:

127.0.0.1:6379> psubscribe s*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "s*"
3) (integer) 1

publish channel content:在指定的频道中发布消息

example:

127.0.0.1:6379> publish mychat 'today is a newday'
(integer) 1
多数据库

传统数据库如MySQL数据库可以自己用语句自定义创建,我们可以通过create database xxxx进行创建。Redis 也是有数据库的,不过Redis已经提前创建好了。在redis默认有十六个数据库,0,1,2....15,在radis上所作的所有数据操作,都是默认在0号数据库上操作,数据库与数据库之间是不能共享键值对的。我们可以把Redis数据库理解为一个map集合。

切换数据库

select 数据库名:切换数据库

example:

127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> select 15
OK
127.0.0.1:6379[15]> select 16
(error) ERR DB index is out of range
数据库的移植

move newkey 数据库名:将当前数据库的key移植到指定的数据库中

example:

127.0.0.1:6379> keys *
1) "list"
2) "set1"
3) "information"
4) "set2"
5) "age"
6) "score2"
7) "set4"
8) "score1"
9) "set3"
127.0.0.1:6379> move information 1
(integer) 1
127.0.0.1:6379> keys *
1) "list"
2) "set1"
3) "set2"
4) "age"
5) "score2"
6) "set4"
7) "score1"
8) "set3"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
1) "information"
数据库清空

flushdb 删除当前数据库中的所有key

flushall 删除所有数据库中的所有key

服务器命令

ping 测试连接是否存活

example:

127.0.0.1:6379> ping
PONG

echo 在命令行打印一些内容

example:

127.0.0.1:6379> echo hehe
"hehe"

quit/Ctrl+C 退出客户端

example:

127.0.0.1:6379> quit

dbsize 返回当前数据库中的key的数目

example:

127.0.0.1:6379> dbsize
(integer) 8

info 获取服务器的信息和统计

example:

127.0.0.1:6379> info
# Server
redis_version:4.9.103
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:d727e4f6fe88cefd
redis_mode:standalone
......
......

8、Redis持久化策略

RDB策略

RDB是redis的默认持久化机制,相当于照快照,保存的是一种状态

优点:

  • 快照速度极快,还原数据速度极快

  • 适用于灾难备份

缺点:

  • 小内存机器不适合使用

RDB机制符合要求就会照快照(随时随地启动),会占用一定的系统资源(突然的)很可能内存不足直接宕机。(宕机后,服务器会关闭,属于非正常关闭,数据会丢失)

RDB机制适用于内存比较充裕的计算机

RDB是何时进行照快照?

  • 服务器正常关闭时,会照一次快照

  • key满足一定条件时,会照一次快照

    • save 900 1#每900秒至少有1个key发生变化,则dump内存快照

    • save 300 10#每300秒至少有10个key发生变化,则dump内存快照

    • save 60 10000#每60秒至少有10000个key发生变化,则dump内存快照

AOF策略

AOF策略是一种使用日志功能保存数据操作的机制,默认AOF机制关闭的,它的操作只会保存导致key变化的语句

优点:

  • 持续性占用极少量的内存资源

缺点:

  • 日志文件会特别大,不适用于灾难恢复

  • 恢复效率远远低于RDB

AOF机制适用于内存比较小的计算机

AOF是如何进行数据备份的呢?

  • 每秒同步:每秒进行一次AOF保存数据,安全性低,比较节省系统资源

  • 每修改同步:只要有key变化语句,就进行AOF保存数据,比较安全,但是这样做极为浪费系统资源,降低效率

  • 不同步:不进行任何持久化操作,这种配置不安全

AOF的配置

  • always #每秒有数据修改发生时都会写入AOF文件

  • everysec #每秒同步一次,该策略为AOF的缺省策略

  • no #从不同步。高效但是数据不会被持久化

开启AOF机制的方法

  1. 在redis.config文件中用:/aof找到对应的段落

  2. 将appendonly no改成appendonly yes

  3. 再修改其中一段成appendfsync always即可

新人入坑Redis必会的吐血总结的更多相关文章

  1. 入坑MATLAB必会的吐血总结

    本渣想回过头来整理一下MATLAB的一些基本的知识(很多东西比较琐碎,应该系统的梳理梳理),下文中没有提到的,自己用help查即可. 此文用来存个档,便于回顾. 由于matlab各版本部分语法存在差异 ...

  2. 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程

    反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)   背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...

  3. web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】

    http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...

  4. [Abp vNext 入坑分享] - 前言

    一·背景 Abp vnext是 ABP 框架作者所发起一个完全基于 ASP .NET Core框架,截至2020年4月份已经升级到2.5.0版本,根据经验2.0版本以后可以放心的使用在生产环境.类似a ...

  5. 写给正在入坑linux系统的伙伴

    光阴似箭,时光如梭,转年出来工作已经3年了.从一个职场新人慢慢熟悉职场的工作方式,适应职场工作的环境,学习了很多知识,也总结了很多经验.现在的目标就是一步一个脚印,慢慢打磨自己,希望早日成为取代其他人 ...

  6. h5 录音 自动生成proto Js语句 UglifyJS-- 对你的js做了什么 【原码笔记】-- protobuf.js 与 Long.js 【微信开发】-- 发送模板消息 能编程与会编程 vue2入坑随记(二) -- 自定义动态组件 微信上传图片

    得益于前辈的分享,做了一个h5录音的demo.效果图如下: 点击开始录音会先弹出确认框: 首次确认允许后,再次录音不需要再确认,但如果用户点击禁止,则无法录音: 点击发送 将录音内容发送到对话框中.点 ...

  7. [转至云风的博客]谈谈陌陌争霸在数据库方面踩过的坑( Redis 篇)

    « 谈谈陌陌争霸在数据库方面踩过的坑(芒果篇) | 返回首页 | linode 广告时间 » 谈谈陌陌争霸在数据库方面踩过的坑( Redis 篇) 注:陌陌争霸的数据库部分我没有参与具体设计,只是参与 ...

  8. 入坑Java的自学之路

    # 入坑Java的自学之路 ## 基础知识 - 编程语言:Java python c- 基本算法- 基本网络知识 tcp/ip http/https- 基本的设计模式 ------ ## 工具方面 - ...

  9. RoboGuice 3.0 (一)入坑篇

    RoboGuice是什么? 一个Android上的依赖注入框架. 依赖注入是什么? 从字面理解,这个框架做了两件事情,第一是去除依赖,第二是注入依赖.简单理解就是,将对象的初始化委托给一个容器控制器, ...

随机推荐

  1. C# 异步编程1 APM 异步程序开发

    C#已有10多年历史,单从微软2年一版的更新进度来看活力异常旺盛,C#中的异步编程也经历了多个版本的演化,从今天起着手写一个系列博文,记录一下C#中的异步编程的发展历程.广告一下:喜欢我文章的朋友,请 ...

  2. 修改sqlserver2008数据库的排序规则 (转)

    修改sqlserver2008数据库的排序规则 (转)      修改SQL server 2008服务器排序规则 SQL Server 2008安装好后,发现服务器排序规则不对,又不想重装SQL S ...

  3. oracle count函数

    用来返回查询的行数. 当指定distinct时,不能接order_by_clause: 如果指定表达式,count返回表达式不为空的值: 当指定*号时,它返回所有行,含重复行和空值.count从不返回 ...

  4. python学习-判断是否是私网IP地址

    判断是否是私网IP地址 私网IP地址范围如下: 192.168.0.0-192.168.255.255 172.16.0.0-172.31.255.255 10.0.0.0-10.255.255.25 ...

  5. ghostscript远程代码执行漏洞复现

    这两天网上ghostscript又又有漏洞信息了,但是没有poc,于是找找资料把今年8月21日的那个验证下 1.关于ghostscript Ghostscript是一套建基于Adobe.PostScr ...

  6. January 17th, 2018 Week 03rd Wednesday

    Don't let go too soon, but don't hold on too long. 不要太快放手,也别紧握太久. It is inevitalbe to encounter with ...

  7. java死锁详解

    进程死锁及解决办法: 一:死锁的概念:    死锁是进程死锁的简称    什么是死锁:    死锁是指多个进程循环等待他方占有的资源而无限的僵持下去的局面.很显然,没有外力作用,那么死锁涉及到的各个进 ...

  8. Cannot uninstall 'pyserial'. It is a distutils installed project and thus we cannot a ccurately determine which files belong to it which would lead to only a partial uninstall. 解决方法

    最近再升级 pyserial模块时,采用 pip install --upgrade pyserial,待模块下载完成准备卸载原版本时 提示:“Cannot uninstall 'pyserial'. ...

  9. 五、git创建及合并分支

    1. 创建并切换到dev分支 git checkout -b dev // git checkout命令加上-b参数表示创建并切换,相当于以下两条命令 git branch dev git check ...

  10. 【转】wampserver2.5 apache2.4.9配置https 图文

    注: 我的wamp环境是2.5版本,apache是2.4.9 装在本地C:wamp 操作系统windows10   1.进入wamp->bin->apache->apache2.4. ...