redis安装及redis数据类型

Redis介绍:

一、介绍

在过去的几年中,NoSQL数据库一度成为高并发、海量数据存储解决方案的代名词,与之相应的产品也呈现出雨后春笋般的生机。然而在众多产品中能够脱颖而出的却屈指可数,如Redis、MongoDB、BerkeleyDB和CouchDB等。由于每种产品所拥有的特征不同,因此它们的应用场景也存在着一定的差异,下面仅给出简单的说明:

      1). BerkeleyDB是一种极为流行的开源嵌入式数据库,在更多情况下可用于存储引擎,比如BerkeleyDB在被Oracle收购之前曾作为MySQL的存储引擎,由此可以预见,该产品拥有极好的并发伸缩性,支持事务及嵌套事务,海量数据存储等重要特征,在用于存储实时数据方面具有极高的可用价值。然而需要指出的是,该产品的Licence为GPL,这就意味着它并不是在所有情况下都是免费使用的。

      2). 对MongoDB的定义为Oriented-Document数据库服务器,和BerkeleyDB不同的是该数据库可以像其他关系型数据库服务器那样独立的运行并提供相关的数据服务。从该产品的官方文档中我们可以获悉,MongoDB主要适用于高并发的论坛或博客网站,这些网站具有的主要特征是并发访问量高、多读少写、数据量大、逻辑关系简单,以及文档数据作为主要数据源等。和BerkeleyDB一样,该产品的License同为GPL。

      3). Redis,典型的NoSQL数据库服务器,和BerkeleyDB相比,它可以作为服务程序独立运行于自己的服务器主机。在很多时候,人们只是将Redis视为Key/Value数据库服务器,然而事实并非如此,在目前的版本中,Redis除了Key/Value之外还支持List、Hash、Set和Ordered Set等数据结构,因此它的用途也更为宽泛。对于此种误解,Redis官网也进行了相应的澄清。和以上两种产品不同的是,Redis的License是Apache License,就目前而言,它是完全免费。

      4). memcached,数据缓存服务器。为什么在这里要给出该产品的解释呢?很简单,因为笔者认为它在使用方式上和Redis最为相似。毕竟这是一篇关于Redis的技术系列博客,有鉴于此,我们将简要的对比一下这两个产品。首先说一下它们之间的最大区别,memcached只是提供了数据缓存服务,一旦服务器宕机,之前在内存中缓存的数据也将全部消失,因此可以看出memcached没有提供任何形式的数据持久化功能,而Redis则提供了这样的功能。再有就是Redis提供了更为丰富的数据存储结构,如Hash和Set。至于它们的相同点,主要有两个,一是完全免费,再有就是它们的提供的命令形式极为接近。

二、redis和memcache对比

持久化:以电商举例,session用memcache来做的,购物车用redis来做的,当你退出的时候会提示你购物车里面的物品会在你退出后继续保持。相对来说memcache存储更单一化!

主从复制:redis的主从复制类似mysql的主从复制但是原理是不同的!

虚拟内存:说白了就是把内存里一些不用的东西放在硬盘上,最好不要用,降低效率,现在内存比较便宜。


Redis安装&基本操作:

Redis安装

1、检查配置环境
检查gcc是否安装,如果没有安装:yum -y install gcc

2、下载安装redis
# wget http://download.redis.io/releases/redis-3.0.7.tar.gz
# tar xf redis-3.0.7.tar.gz -C /usr/local
# cd /usr/local
# ln -sv redis-3.0.7/ redis
`redis' -> `redis-3.0.7/'
# cd redis
# make && make install
# 安装中可能遇到的问题:
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
 
Allocator
-----------------------------------------------------------------------
Selecting a non-default memory allocator when building Redis is done by setting
the `MALLOC` environment variable. Redis is compiled and linked against libc
malloc by default, with the exception of jemalloc being the default on Linux
systems. This default was picked because jemalloc has proven to have fewer
fragmentation problems than libc malloc.
To force compiling against libc malloc, use:
% make MALLOC=libc
To compile against jemalloc on Mac OS X systems, use:
% make MALLOC=jemalloc
 
allocator(分配算符),如果有MALLOC这个环境变量,会有用这个环境变量的 去建立Redis。
而且libc 并不是默认的分配器,默认的是jemalloc!
因为jemalloc被证明有更少的fragmentation problems比libc。
 
但是如果你又没有jemalloc 而只有 libc 当然 make 出错。 所以加这么一个参数。
make MALLOC=libc
-----------------------------------------------------------------------

3、配置redis
# cp utils/redis_init_script /etc/init.d/redis  #管理脚本
# chmod +x /etc/init.d/redis
# mkdir /etc/redis
# cp redis.conf /etc/redis/6379.conf

4、修改redis启动方式
默认redis启动是启动在前台的,我把他修改成在后台启动
# vim /etc/redis/6379.conf
daemonize no改为daemonize yes

5、redis加入系统服务并设置为开机启动
首先修改redis启动脚本:
# vim /etc/init.d/redis
#chkconfig: 35 95 95 在第三行加上即可

#添加系统服务: chkconfig --add redis
#设置开机启动: chkconfig redis on
#检查服务状态: chkconfig --list redis
redis           0:off   1:off   2:on    3:on    4:on    5:on    6:off

6、指定日志文件存放位置&PID文件&数据库文件存放位置
# vim /etc/redis/6379.conf
logfile "/var/log/redis.log"  #指定日志文件如果不指定就会在控制台输出
pidfile /var/run/redis_6379.pid
dir /u01/redis  #这个是指默认的持久化配置文件放在哪里

#pidfile如果不修改使用默认的话就会报错:
原因是在/etc/init.d/redis里指定的默认PID是:PIDFILE=/var/run/redis_${REDISPORT}.pid
但是默认配置文件:/etc/redis/6379.conf(咱们自己从解压包里复制的默认是:pidfile /var/run/redis.pid)

二、Redis基本操作

SET 设置Key

GET 判断Key的值

EXISTS 判断Key是否存在

KEYS * 显示所有的Key

DEL 删除指定Key

TYPE 获取Key类型


注:Redis是不区分大小写的,命令最好使用大写这样能区分命令还是参数!


1、set的例子:
# redis-cli
127.0.0.1:6379> SET hello world
OK
127.0.0.1:6379> GET hello
"world"

2、设置多个key value 然后使用keys * 去查看所有
127.0.0.1:6379> SET hello1 zhangsan
OK
127.0.0.1:6379> SET hello2 lishi
OK

1) "hello2"
2) "hello"
3) "hello1"

KEY匹配方式:
?匹配单个
*匹配所以

3、判断key是否存在
判断key是否存在使用:EXISTS 他返回的整型:0不存在,1存在
127.0.0.1:6379> EXISTS hello
(integer) 1
127.0.0.1:6379> EXISTS hehe
(integer) 0
127.0.0.1:6379> EXISTS zhangsan
(integer) 0
127.0.0.1:6379> EXISTS hello1
(integer) 1

4、删除KEY
127.0.0.1:6379> DEL hello
(integer) 1
127.0.0.1:6379> DEL hello1 hello2
(integer) 2
127.0.0.1:6379> KEYS *
(empty list or set)

5、查看类型TYPE
只要用set类型就是字符串。查看类型命令用TYPE
127.0.0.1:6379> SET hello world
OK
127.0.0.1:6379> TYPE hello
string

6、Keyspace
redis是支持多个实例的,默认最多16个,可以修改配置文件来支持更多!
使用INFO命令查看
127.0.0.1:6379> INFO

db0:keys=1,expires=0,avg_ttl=0
#db0:这个可以理解为命名空间。最多支持16个,使用SELECT去切换

127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> SET db1 hehe  #添加一个key-value
OK
127.0.0.1:6379[1]> INFO  #使用INFO查看

db0:keys=1,expires=0,avg_ttl=0
db1:keys=1,expires=0,avg_ttl=0


Redis数据类型:

他用不同的命令来区分你要操作什么数据类型

类型不能嵌套,不能混!但是有个王炸:set能把所有的类型都改为字符串类型!

1、字符串类型:

SET
GET
DEL
APPEND 在值的后面追加
SET能重新设置但是要追加的话使用APPEND最好
127.0.0.1:6379[1]> SET hehe hello
OK
127.0.0.1:6379[1]> GET hehe
"hello"
127.0.0.1:6379[1]> APPEND hehe ,world
(integer) 11
127.0.0.1:6379[1]> GET hehe
"hello,world"

可以同时设置多个值和查询值用MSET和MGET
127.0.0.1:6379[1]> MSET key1 v1 key2 v2 key3 v3
OK
127.0.0.1:6379[1]> MGET key1 key2 key3
1) "v1"
2) "v2"
3) "v3"

获取字符串长度
127.0.0.1:6379[1]> STRLEN hehe
(integer) 11
如果字符串是中文的他会按照UTF-8格式的来输出1个字等3个字符串来算的
127.0.0.1:6379[1]> SET key "呵呵"
OK
127.0.0.1:6379[1]> GET key
"\xe5\x91\xb5\xe5\x91\xb5"
127.0.0.1:6379[1]> STRLEN key
(integer) 6

2、自增类型

比如说投票点下+1 ,如果说用set每点一次修改set下那就不太现实。所有redis有个自增类型:INCR
127.0.0.1:6379[1]> INCR num
(integer) 1    #默认如果没有这个值的话,INCR就会自动创建一个值默认为零,当你没执行一次他就会+1
127.0.0.1:6379[1]> INCR num
(integer) 2
127.0.0.1:6379[1]> INCR num
(integer) 3
127.0.0.1:6379[1]> INCR num
(integer) 4
127.0.0.1:6379[1]> INCR num

如果想加多个:INCRBY
127.0.0.1:6379[1]> INCRBY num 10
(integer) 15
127.0.0.1:6379[1]> INCRBY num 10
(integer) 25
127.0.0.1:6379[1]> INCRBY num 10
(integer) 35

减呢? DECR
127.0.0.1:6379[1]> DECR num
(integer) 34
127.0.0.1:6379[1]> DECR num
(integer) 33

如果要减多个:NECRBY
127.0.0.1:6379[1]> DECRBY num 5
(integer) 28
127.0.0.1:6379[1]> DECRBY num 5
(integer) 23
127.0.0.1:6379[1]> DECRBY num 5
(integer) 18

想支持小数点:
INCRBYFLOAT key 0.1
127.0.0.1:6379[1]> INCRBYFLOAT nums 0.1
"0.1"
127.0.0.1:6379[1]> INCRBYFLOAT nums 0.1
"0.2"
127.0.0.1:6379[1]> INCRBYFLOAT nums 0.1
"0.3"
127.0.0.1:6379[1]> INCRBYFLOAT nums 0.1
"0.4"

3、散列类型(hash)

和数据库存的表似的,表不是有的字段吧,可以给每个字段设置个值
HSET Key field value
HGET Key field
HMSET Key field value [field value....]
HMGET Key field [field ...]
HGETALL Key
HDEL

127.0.0.1:6379[1]> HSET shouji name iphone
(integer) 1
127.0.0.1:6379[1]> HSET shouji co red
(integer) 1
127.0.0.1:6379[1]> HSET shouji price 8888
(integer) 1
127.0.0.1:6379[1]> HGET shouji name
"iphone"
127.0.0.1:6379[1]> HGET shouji co
"red"
127.0.0.1:6379[1]> HGET shouji price
"8888"
127.0.0.1:6379[1]> HGETALL shouji
1) "name"
2) "iphone"
3) "co"
4) "red"
5) "price"
6) "8888"

其实现在看着不是好看的但是他通过一些API调用到网页上,通过排版取出来的值就好看了
127.0.0.1:6379[1]> HMSET diannao name dell co black price 5000
OK
127.0.0.1:6379[1]> HMGET diannao name co price
1) "dell"
2) "black"
3) "5000"

4、列表类型

列表类型:他是存储一个有序的字符串列表   这个“有序”是什么时候进来的!
 
 
列表你向左边添加和右边添加他的时间复杂度是一样的!O1(时间复杂度)
可以理解为:我这个速度不随着数量的增加而增加!比如1000行和1万行他的时间开销是一样的!  大学数据结构里学的
 
时间复杂度:
同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和
改进算法。计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。
 
但是他有个缺点,比如说里面有1万个key你想找到第98个这就费老劲了他从1开始数数到98
优点,你读前100个,卡直接读头部就非常快了
 
 
命令:
LPUSH key value [value ...]
RPUSH key value [value ...]
               LPOP key
               RPOP key
     LRANGE key start stop
     LREM key count value

4.1、从左边添加key
127.0.0.1:6379[1]> LPUSH sum 0
(integer) 1
127.0.0.1:6379[1]> LPUSH sum 1
(integer) 2
127.0.0.1:6379[1]> LPUSH sum 2
(integer) 3
#现在是从左边加 2 1 0

#从右边开始加
127.0.0.1:6379[1]> RPUSH sum 3
(integer) 4
127.0.0.1:6379[1]> RPUSH sum 5
(integer) 5
#现在应该是 2 1 0 3 5

如果想获取长度就使用LNE吗!获取列表类型长度就是:LLEN
127.0.0.1:6379[1]> LLEN sum
(integer) 5

4.2、从左边拿key
从列表类型里拿出这个Key来(拿出来就没有了),从左边拿左边第一个
127.0.0.1:6379[1]> LPOP sum
"2"

左边第一个是2那么拿出来之后这个key就变成   1 0 3 5

从右边拿Key,从右边拿右边第一个
127.0.0.1:6379[1]> RPOP sum
"5"   (5被拿出来了)

现在在看下这个key的长度
127.0.0.1:6379[1]> LLEN sum
(integer) 3

4.3、获取列表的某一个范围:
现在是这个值 1 0 3

127.0.0.1:6379[1]> LRANGE sum 0 1   #取0 - 1 的值
1) "1"
2) "0"

###这个列表和python中列表中差不多,0 -1 相当于列表中的下标。

127.0.0.1:6379[1]> LPUSH sum 2
(integer) 4
127.0.0.1:6379[1]> RPUSH sum 4
(integer) 5


127.0.0.1:6379[1]> LRANGE sum 0 -1  #这里的(-1)表示左边第一个
1) "2"
2) "1"
3) "0"
4) "3"
5) "4"

4.4、获取指定元素的值
获取右边的第一个值:
127.0.0.1:6379[1]> LINDEX sum -1
"4"
获取右边的第二个值:
127.0.0.1:6379[1]> LINDEX sum -2
"3"
127.0.0.1:6379[1]> LINDEX sum -3   
"0"

从左边获取值
127.0.0.1:6379[1]> LINDEX sum 0
"2"
127.0.0.1:6379[1]> LINDEX sum 1
"1"

4.5、只保留指定数据
只保留0到2的数据
127.0.0.1:6379[1]> LTRIM sum 0 2
OK
127.0.0.1:6379[1]> LRANGE sum 0 -1
1) "2"
2) "1"
3) "0"

这个有什么用呢:
写日志的时候,我这个缓冲区,只保留最近100条日志!
比如:
127.0.0.1:6379[1]> LPUSH logs newloghehe
(integer) 1
127.0.0.1:6379[1]> LTRIM sum 0 99
OK

这样的话我的列表永远只有100条,我只看最近100条的日志!!

5、集合类型

交集∩、并集∪、合集、等 0 0 !
 
集合的元素是没有类型的!
用到集合类型的应用有:(新浪微博分享了很多的redis应用)
比如:关注微博,比如咱俩是否共同关注了某一个人等。
 
5.1、添加集合
127.0.0.1:6379[1]> SADD jihe1 a b c
(integer) 3
127.0.0.1:6379[1]> SADD jihe2 b c d
(integer) 3

5.2、查看集合内容
127.0.0.1:6379[1]> SMEMBERS jihe1
1) "c"
2) "b"
3) "a"

5.3、判断集合元素是否存在
127.0.0.1:6379[1]> SISMEMBER jihe1 d
(integer) 0  #返回0说明不存在
127.0.0.1:6379[1]> SISMEMBER jihe1 b
(integer) 1  #返回1说明存在

5.4、集合间运算
支持:交集、差集、并集
 
差集运算:
127.0.0.1:6379[1]> SDIFF jihe1 jihe2
1) "a"
127.0.0.1:6379[1]> SDIFF jihe2 jihe1
1) "d"

交集运算:
127.0.0.1:6379[1]> SINTER jihe1 jihe2
1) "c"
2) "b"

交集可以设置多个:在添加一个jihe3
127.0.0.1:6379[1]> SADD jihe3 d e f
(integer) 3

127.0.0.1:6379[1]> SINTER jihe1 jihe2 jihe3
(empty list or set)
#这个是因为他是jihe1和jihe2先做交集运算,然后在和jihe3做交集运算

并集运算
127.0.0.1:6379[1]> SUNION jihe1 jihe2
1) "c"
2) "d"
3) "a"
4) "b"
#同样key设置多个
127.0.0.1:6379[1]> SUNION jihe1 jihe2 jihe3
1) "c"
2) "f"
3) "b"
4) "a"
5) "e"
6) "d"

以上的集合是无序的,redis支持有序的集合他的名如下
ZADD key score member 增加元素
ZSCORE key member 获取元素的分数
ZRANGE key start stop [WITHSCORES]
ZRANGEBYSCORE key min max

添加有序集合
127.0.0.1:6379> ZSCORE youxu 80 a
(integer) 1
127.0.0.1:6379> ZADD youxu 81 b
(integer) 1
可以添加多个
127.0.0.1:6379> ZADD youxu 82 c 83 d
(integer) 2

获取分数
127.0.0.1:6379[1]> ZSCORE youxu a
"80"
127.0.0.1:6379[1]> ZSCORE youxu b
"81"
127.0.0.1:6379[1]> ZSCORE youxu c
"82"
127.0.0.1:6379[1]> ZSCORE youxu d
"83"

获取有序集合范围
127.0.0.1:6379[1]> ZRANGE youxu 0 3  #参考列表集合的0 3  从0到3的元素
1) "a"
2) "b"
3) "c"
4) "d"

在举个例子:
127.0.0.1:6379[1]> ZADD youxu 84 e
(integer) 1
127.0.0.1:6379[1]> ZRANGE youxu 0 4
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379[1]> ZADD youxu 79 f
(integer) 1
127.0.0.1:6379[1]> ZRANGE youxu 0 5
1) "f"
2) "a"
3) "b"
4) "c"
5) "d"
6) "e"

######f在前面因为他的score小!
热门文章,可以用这个来排序,我可以给他设置一个分数!!!!!

你可能感兴趣的:(oracle,数据库,服务器)