데이터타입 (2)

이번 포스팅에서는 간략하게 레디스에 어떠한 타입이 있고 어떤 명령어로 해당 타입의 값을 추가 또는 조회하는 지 등의 예제를 보여드릴 겁니다.

레디스는 String, Hash, List, Set, Sorted Set 등의 데이터 타입을 지원합니다.


Strings (스트링)

레디스 스트링은 순차적인 바이트들입니다. 레디스에서 스트링은 binary safe한데 이것은 스트링이 알수있는 길이를 가지고 있고 어떤 특별한 종료문자에 의해 종료되지 않는 다는 것을 의미합니다. 따라서, 한 스트링당 최대 512MB 길이의 값을 저장할 수 있습니다.

Example (예제)

redis 127.0.0.1:6379> SET name "keichee" OK redis 127.0.0.1:6379> GET name "keichee"

위 예제에서 사용된 SET과 GET명령어는 데이터를 저장하거나 조회할 때 사용되는 명령어입니다.

그리고 name은 레디스에 저장할 때 키 값을 의미하며 "keichee"는 name이라는 키에 대응해서 저장될 값을 의미합니다.


Hashes (해쉬)

레디스 해쉬는 키-값 페어의 컬렉션입니다. 스트링 필드와 스트링 값을 매핑해주기 때문에 객체를 표현할 때 자주 사용됩니다.

Example

redis 127.0.0.1:6379> HMSET user:1 wow awesome keichee handsome blah handsome
OK
redis 127.0.0.1:6379> HGETALL user:1

1) "wow"
2) "awesome"
3) "keichee"
4) "handsome"
5) "blah"
6) "handsome"

위 예제에서 user:1 이라는 키에 wow, awesome, keichee, handsome, blah, handsome 이라는 값을 세팅하고 있습니다. 여기서 HMSET은 해쉬에 저장할 때, HGETALL 은 해쉬에 저장된 데이터를 조회할 때 사용되는 명령어입니다.

해쉬에 저장할 수 있는 키-값 페어의 개수는 총 (2^32) - 1 개 입니다.


Lists (리스트)

리스트는 목록형태의 데이터 타입을 말합니다. 스트링 목록을 말하며 삽입한 순서대로 정렬되어 저장됩니다. 

레디스 리스트는 제일 앞에 추가하는 것과 제일 마지막에 추가하는 명령어가 있습니다..

Example

redis 127.0.0.1:6379> lpush dblist redis
(integer) 1
redis 127.0.0.1:6379> lpush dblist mongodb
(integer) 2 redis 127.0.0.1:6379> lpush dblist rabitmq
(integer) 3 redis 127.0.0.1:6379> lrange dblist 0 10
1) "rabitmq" 2) "mongodb" 3) "redis"

리스트의 최대 길이는 (2^32) - 1 개 입니다. (총 4294967295 개).

lpush는 리스트의 제일 앞에 데이터를 추가하고자 할 때 사용하는 명령어입니다. 

lpush dblist redis 명령어는 dblist라는 이름의 리스트에 redis라는 값을 저장하라는 것을 의미합니다.

위 예제에서는 redis, mongodb, rabitmq를 dblist라는 리스트에 저장한 뒤 lrange 명령어를 이용하여 0부터 10까지의 데이터를 조회하고 있습니다.


Sets (집합)

레디스에서 집합은 정렬되지 않은 스트링 목록을 말합니다. 

세트는 추가, 삭제, 그리고 존재여부를 확인하는 명령어를 O(1) 시간복잡도로 제공합니다.

Example

redis 127.0.0.1:6379> sadd dbset redis
(integer) 1 redis 127.0.0.1:6379> sadd dbset mongodb (integer) 1 redis 127.0.0.1:6379> sadd dbset rabitmq (integer) 1 redis 127.0.0.1:6379> sadd dbset rabitmq (integer) 0 redis 127.0.0.1:6379> smembers dbset 1) "rabitmq" 2) "mongodb" 3) "redis"

NOTE: 위 예제에서 rabitmq는 두 번 추가가 되었지만 세트의 기본 속성인 유니크 속성 때문에 하나의 rabitmq만 저장됩니다.

sadd는 집합에 데이터를 추가할 때 쓰이는 명령어이며, 집합을 조회할 때에는 smembers 명령어를 사용하시면 됩니다.

조회되는 데이터는 집합에 추가된 순서와는 관계없이 랜덤하게 조회가 됩니다. 즉, 순서를 보장하지 않습니다.

set에 저장할 수 있는 데이터 개수 역시 (2^32) - 1 개입니다. 


Sorted Sets (정렬 집합)

정렬된 집합은 말그대로 집합인데 정렬된 것을 말합니다. 유니크 속성 역시 그대로 가지고 있으며. 일반 집합과의 차이점은 정렬을 위한 score 값을 가지고 있다는 것입니다.

Example

redis 127.0.0.1:6379> zadd sorted 0 redis (integer) 1 redis 127.0.0.1:6379> zadd sorted 0 mongodb (integer) 1 redis 127.0.0.1:6379> zadd sorted 0 rabitmq (integer) 1 redis 127.0.0.1:6379> zadd sorted 0 rabitmq (integer) 0 redis 127.0.0.1:6379> ZRANGEBYSCORE sorted 0 1000 1) "redis" 2) "mongodb" 3) "rabitmq"

위 예제에서 처럼 정렬집합에 데이터를 넣을때는 zadd 명령어를 사용하며 집합명 다음에 score(점수)를 명시해주는데,


이 점수는 각 데이터 마다 중복하여 사용될 수 있으며 중복된 점수를 갖는 데이터는 조회 시 순서가 보장되지 않습니다.


ZRANGEBYSCORE 명령어는 점수를 기준으로 집합을 조회 하라는 의미입니다.




이 외에도 스트링 기반의 비트맵(Bitmap)이나 하이퍼로그로그스(HyperLogLogs)와 같은 데이터 타입도 지원하고 있습니다. 


이러한 타입에 대해서 레디스 공식 문서에는 아래와 같이 설명을 하고 있습니다.

  • Bit arrays (or simply bitmaps): it is possible, using special commands, to handle String values like an array of bits: you can set and clear individual bits, count all the bits set to 1, find the first set or unset bit, and so forth.
스트링 값을 비트의 배열로 다루기 위한 특별한 명령어를 제공한다고 합니다. 각각의 비트를 세팅하거나 1로 세팅된 모든 비트의 개수를 구하거나 하는 등등의 기능을 제공합니다.
  • HyperLogLogs: this is a probabilistic data structure which is used in order to estimate the cardinality of a set. Don't be scared, it is simpler than it seems... See later in the HyperLogLog section of this tutorial.

통계학적 데이타 구조로 집합의 카디날리티를 측정하기 위해서 사용된다고 합니다. 생각보다 쉬우니까 사용하기를 두려워하지 말라고 하네요 ㅋㅋ


자세한 내용은 각각의 데이터 타입에 대한 개별 포스팅에서 확인하시기 바랍니다. ^-^


이상 케이치였습니다.


즐겁고 행복한 하루 되세요~



JavaScript 데이타 타입

JavaScript에는 세가지 primitive 데이타 타입이 존재합니다. 숫자, 스트링, 그리고 참, 거짓을 나타내는 boolean이 바로 그 데이타 타입입니다. 자바스크립트에는 또한 nullundefined 라는 데이타 타입이 있습니다. 좀 특수한 녀석들이죠. 

그리고 마지막으로, 자바스크립트도 자바와 마찬가지로 객체타입을 지원합니다.  

JavaScript에서 숫자는 소수점 형태의  값으로 표현됩니다.  IEEE 754 표준에 정의된 64-bit 소수점 형태로 말이죠.

JavaScript 변수

자바스크립트에서 변수를 선언할 때는 var키워드를 사용합니다.
<script type="text/javascript">
<!--
var money;
var name;
//-->
</script>

 

여러개의 변수를 선언할 때 꼭 var를 앞에 붙여야 하나요? 아닙니다. 아래처럼 한줄에 var키워드를 한번만 써서 변수 두개를 선언할 수도 있습니다. 

<script type="text/javascript">
<!--
var money, name;
//-->
</script>

이렇게 선언된 변수에 값을 넣는것을 변수 초기화라고 합니다. 변수 초기화는 변수를 선언할 때 할 수도 있지만 나중에 할 수도 있습니다.아래 예제를 한번 볼까요?

<script type="text/javascript">
<!--
var name = "Ali";
var money;
money = 2000.50;
//-->
</script>

위 예제에서 ​name이라는 변수는 변수 선언과 동시에 초기화를 해주었습니다. 그런데 money변수는 선언을 하고 난 뒤에 나중에 변수를 초기화했죠. 

여타의 프로그래밍 언어와는 다르게 자바스크립트는 변수의 타입을 지정해주지 않습니다. 변수에 들어갈 값이 스트링인지 숫자인지 관계가 없다는 말이죠. 이건 자바스크립트가 알아서 자동으로 케어해주니 신경쓰지 않으셔도 됩니다.  

JavaScript 변수의 범위

변수에는 크게 전역 변수와 로컬 변수가 있습니다. 전역 변수는 global 변수로 어디서나 접근이 가능한 변수이고 로컬변수는 그 변수가 정의된 함수 내에서만 사용될 수 있는 변수를 말합니다.

동일한 이름의 변수를 선언하게 된다면 로컬에서는 전역변수보다 로컬변수가 우선순위가 높기 때문에 로컬변수를 사용하게 됩니다.  

아래 예제를 한번 보시죠. 

<script type="text/javascript">
<!--
var myVar = "global"; // Declare a global variable
function checkscope( ) {
   var myVar = "local";  // Declare a local variable
   document.write(myVar);
}
//-->
</script>

 

myVar라는 이름을 갖는 변수가 두 번 선언되었습니다. 하나는 전역변수이고 하나는 로컬 변수죠.

위 스크립트의 실행 결과가 어떻게 나와야 맞는 걸까요??

추측해보시고 결과는 스크립트를 실행시켜서 확인해보세요 ^__^

 

JavaScript 변수명 규칙

 

자바스크립트에서 변수이름을 정할때는 아래와 같은 규칙을 지키셔야 합니다.

  • JavaScript 예약어 사용 금지

  • 숫자로 시작할 수 없다. 문자나 밑줄로 시작해야 한다.  

  • 대소문자를 구분한다.

 

JavaScript 예약어 목록

abstract
boolean
break
byte
case
catch
char
class
const
continue
debugger
default
delete
do
double
else
enum
export
extends
false
final
finally
float
for
function
goto
if
implements
import
in
instanceof
int
interface
long
native
new
null
package
private
protected
public
return
short
static
super
switch
synchronized
this
throw
throws
transient
true
try
typeof
var
void
volatile
while
with

 

 

 

Reference : http://www.tutorialspoint.com/javascript/javascript_variables.htm