Redis是什么?
Redis(Remote Dictionary Server),即远程字典服务。C语言编写,持久化日志,Key_Value数据库。读的速度是110000次/S,写的速度是81000次/S。
Redis可以干什么?
它可以用作数据库、缓存和消息中间件MQ。
redis.conf :
- 他是redis的基础配置文件。
- databases 16 表示redis有16个数据库,默认使用的是第0个。
redis是单线程的,为什么不用多线程呢?
因为我们的redis是基于内存操作的,CPU才是基于线程,所以redis的瓶颈是内存和网络带宽,所以就使用了单线程了。
redis为什么单线程还这么快呢?
因为redis是基于内存实现的,多线程是使用的CPU,使用多线程的时候CPU会不断进行上下文切换,这是非常耗时的。对于内存系统来说没有上下文切换,多次读写都是在一个CPU上面完成的,所以这种方式是效率最高的。
*********************基础命令讲解***************下面的key表示键*************value表示值************
redis基础命令 :
- select 3就可以切换到3号数据库了。
- DBSIZE 可以查看当前数据库DB大小。
- keys * 可以查看当前数据库所以的key。
- set 值 、get 可以存取数据。
- flushdb flushall 清空当前数据库和全部数据库。
- EXISTS key 可以查看当前key是否存在。
- EXPIRE name 10 设置的key(name) 10秒以后过期。
- ttl key 检测当前key还有多少秒过期。
- setex key 30 value 将我们的key设置一个30秒过期的值。
- setnx key value 根据key设置一个值,如果没有就会创建成功,如果存在就会创建失败,这种一般适用于分布式锁中会常常使用。
- mset k1 v1 k2 v2 k3 v3, 他可以一次性set多个 k1对v1 k2对v2 k3对v3
- mget k1 k2 k3 ,一次性取出k1 、 k2 、 k3 的值。
- msetnx k1 v1 k2 v2 这里创建了两个键值对,如果没有就会创建成功,如果有的话就会创建失败,他是一个原子性的,其中只有一个有的话也会创建失败的。
- getset key value 先根据key获取在根据key设置value。
redis步长操作命令 :
- incr key 只能向int类型key里面的数据加一,其他数据会报错,调一次加一次。
- incrBY key 10 只能向int类型key里面的数据加十,其他数据会报错,调一次加十次。
- decr key 只能向int类型key里面的数据减一,其他数据会报错,调一次减一次。
- decrBY key 10 只能向int类型key里面的数据减十,其他数据会报错,调一次减十次。
redis五大数据类型 :
String : 我们最常用的字符串存储方式,想常用的key-value都是字符串形式。
- type key 查询出当前key是什么数据类型的。
- APPEND key value 动态修改值,往值后面追加数据,如果key不存在就相当于set了一个key。
- strlen key 根据key获取字符串长度。
- GETRANGE key 0 3 获取0-3的字符串,如果想通过这种方式获取全部字符串就把3改成-1。
- SETRANGE key 1 value 通过key将下标为1的字符替换成我们后面的值。
List :使用list所有命令都是用 l 开头的。
127.0.0.1:6379> LPUSH list o1 o2 # 给key(list)插入一个或多个值
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1 # 获取全部插入的值(从0到全部 -1表示全部)
1) "o2"
2) "o1"
127.0.0.1:6379> LPUSH list o3 # 再次给key(list)插入一个值
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "o3"
2) "o2"
3) "o1"
127.0.0.1:6379> Rpush list o6 # 再次给key(list)在 最后 插入一个值 (这里要注意一下)
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1 #再次获取
1) "o3"
2) "o2"
3) "o1"
4) "o6"127.0.0.1:6379> LPOP list # 移除list第一个元素
"o3"
127.0.0.1:6379> LRANGE list 0 -1
1) "o2"
2) "o1"
3) "o6"
127.0.0.1:6379> RPOP list # 移除list最后一个元素
"o6"
127.0.0.1:6379> LRANGE list 0 -1
1) "o2"
2) "o1"
127.0.0.1:6379>127.0.0.1:6379> LINDEX list 1 # 获取list指定的一个元素
127.0.0.1:6379> Llen list # 返回list的长度
(integer) 2127.0.0.1:6379> LREM list 1 22 # 移除list里面的22,并且最少移除一个
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "44"
2) "44"
3) "44"
4) "33"
5) "o2"
6) "o1"
127.0.0.1:6379> LREM list 2 44 # 移除list里面的44,并且最少移除2个
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "44"
2) "33"
3) "o2"
4) "o1"
127.0.0.1:6379>127.0.0.1:6379> ltrim list 1 2 #通过下标截取指定list,截取以后将截取的覆盖当前的
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "33"
2) "o2"
127.0.0.1:6379> Lset list 0 value #将list中指定下标的值更新成另一个value127.0.0.1:6379> Lset list 0 value other #替换目标中的值,不存在就会报出异常
总结 :
- list他实际上是一个链表,before node after ,left,right都可以插入值。
- 如果key存在就新增内容,不存在就创建新链表
- 在两边插入或改动值效率是最高的,操作中间的数据效率会低一点。
- 消息队列,这样我们就可以通过删除和取左边数据存入右边数据的方式完成一个消息队列了。
Set:使用Set所有命令都是用 s 开头的。set是无序的集合
127.0.0.1:6379> SADD set 666 #根据key存入一个值
(integer) 1
127.0.0.1:6379> SMEMBERS set #根据key取出set
1) "666"
2) "222"
3) "nihao"
127.0.0.1:6379> SISMEMBER set 666 #判断key是否存在
(integer) 1
127.0.0.1:6379> scard set #获取元素个数
(integer) 3
127.0.0.1:6379> SREM set 222
(integer) 1
127.0.0.1:6379> SMEMBERS set
1) "666"
2) "nihao"
127.0.0.1:6379> SRANDMEMBER SET
(nil)
127.0.0.1:6379> SRANDMEMBER set #set是无序的,所以可以随机抽取一个元素
"nihao"
127.0.0.1:6379> SRANDMEMBER set
"666"
127.0.0.1:6379> SRANDMEMBER set 2 #set是无序的,所以可以随机抽取两个元素
1) "666"
2) "nihao"
127.0.0.1:6379> SMEMBERS set #根据key随机移除一个元素
Hash:使用Hash所有命令都是用 h 开头的。我们可以看成一个map集合,他本质和String类型没有太大的区别,还是一个简单的key-value
127.0.0.1:6379> hset hash key1 111 #设置单个值 key-value
(integer) 1
127.0.0.1:6379> hget hash key1 #获取单个值
"111"
127.0.0.1:6379> hmset hash1 key1 111 key2 222 #设置多个值 key-value key-value .....
OK
127.0.0.1:6379> hmget hash1 key1 #获取多个值中的单个值
1) "111"
127.0.0.1:6379> hmget hash1 key1 key2 #获取多个值
1) "111"
2) "222"
127.0.0.1:6379> hget hash key1 #删除hash指定的key字段,对应的value也没有了
(nil)
127.0.0.1:6379>
127.0.0.1:6379> hlen hash #获取hash的字段数量,如果hash不存在就会报异常
(integer) 2
127.0.0.1:6379>127.0.0.1:6379> HEXISTS hash key #判断hash中指定字段是否存在
(integer) 1
127.0.0.1:6379>127.0.0.1:6379> hkeys hash1 #获取指定hash中的所有key
1) "key1"
2) "key2"
127.0.0.1:6379> hvals hash1 #获取指定hash中的所有value
1) "111"
2) "222"
127.0.0.1:6379>127.0.0.1:6379> hset hash3 number 1 #设置初始值
(integer) 1
127.0.0.1:6379> HINCRBY hash3 number 1 #指定增量
(integer) 2
127.0.0.1:6379> HINCRBY hash3 number 1 #指定增量
(integer) 3
127.0.0.1:6379> HINCRBY hash3 number -1 #指定减量
(integer) 2
127.0.0.1:6379>
Zset:使用Zset所有命令都是用 z 开头的。他是一个有序集合
127.0.0.1:6379> zadd key on #保存单个值
(integer) 1
127.0.0.1:6379> zadd key 2 on1 3 on2 #保存多个值
(integer) 2
127.0.0.1:6379> zget zset
(error) ERR unknown command `zget`, with args beginning with: `zset`,
127.0.0.1:6379> ZRANGE key 0 -1 #获取全部值
1) "on"
2) "on1"
3) "on2"
127.0.0.1:6379>**************************************下面排序使用************************************
下面 -inf +inf 表示无限大,我们也可以指定数字来操作范围
127.0.0.1:6379> zadd key 6000 zhangs
(integer) 1
127.0.0.1:6379> zadd key 500 lisis
(integer) 1
127.0.0.1:6379> zadd key 3000 wangw
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE key -inf +inf #按从小到大排序显示出来
1) "lisis"
2) "wangw"
3) "zhangs"127.0.0.1:6379>ZREVRANGE SALARY 0 -1 #按从大到小排序显示出来
127.0.0.1:6379> ZRANGEBYSCORE key -inf +inf withscores #显示全部的
1) "lisis"
2) "500"
3) "wangw"
4) "3000"
5) "zhangs"
6) "6000"
127.0.0.1:6379>127.0.0.1:6379> ZRANGEBYSCORE key -inf 6000 withscores #显示数据小于6000的
1) "lisis"
2) "500"
3) "wangw"
4) "3000"
5) "zhangs"
6) "6000"
127.0.0.1:6379>127.0.0.1:6379> ZRem key wangw #移除key中指定的元素
(integer) 1127.0.0.1:6379> Zcard key #获取指定集合中的个数
(integer) 1
总结 : 主要可以使用来做一些排序、排行榜、成绩等等
**************************************************************************************************************
324

被折叠的 条评论
为什么被折叠?



